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;
}
分治
动态规划