hdu 1584 蜘蛛纸牌 搜索 分治 动态规划

搜索

http://acm.hdu.edu.cn/showproblem.php?pid=1584

 枚举每张未移动的牌 移动到后面的第一张未移动的牌上去 比如要移动1 而 2  3  4 都移动过了 就把1移动到 5上去 因为 2 3 4 一定都移动到了 5上面

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int a[12],vis[12],min1;

void dfs(int cur,int temp)
{
    int i,j;
    if(temp>=min1)   
        return ;    //剪枝 相当重要 没有很容易超时
    if(cur==9)    //十张牌只要移动九次就可以了
    {
        min1=temp;
        return ;
    }
    for(i=1;i<10;i++)  //第cur次移动  移动i牌
        if(!vis[i])
        {
            for(j=i+1;j<=10;j++)
                if(!vis[j])
                {
                    vis[i]=1;
                    dfs(cur+1,temp+abs(a[i]-a[j]));
                    break;
                }
            vis[i]=0;
        }
        return ;
}

int main()
{
    int i,t,c;
    scanf("%d",&t);
    while(t--)
    {
        for(i=1;i<=10;i++)
        {
            scanf("%d",&c);  //牌c 在位置i 处
            a[c]=i;
        }
        min1=100000;
        memset(vis,0,sizeof(vis));
        dfs(0,0);
        printf("%d\n",min1);
    }
    return 0;
}

分治

动态规划

原文地址:https://www.cnblogs.com/assult/p/3052178.html