#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
using namespace std;
int a[20],vis[20],res;
void dfs(int cnt,int cost){
if(cost > res) return ; //剪枝
if(cnt==9){
res = cost;
return ;
}
for(int i=1;i<10;i++){ //枚举被移动的牌
if(!vis[i]){ //没被移动过才行,否则就不是最底下的牌了
vis[i] = true;
for(int j=i+1;j<=10;j++){ //枚举移动到哪个牌上
if(!vis[j]){
dfs(cnt+1,cost+abs(a[i]-a[j]));
break; //由于是找最小代价,所以找到最小的即可
}
}
vis[i] = false;
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int val;
for(int i=1;i<=10;i++){ //读取第i个位置上的值
scanf("%d",&val);
a[val] = i;
}
memset(vis,false,sizeof(vis));
res = INT_MAX;
dfs(0,0);
printf("%d\n",res);
}
return 0;
}
HDU 1584 蜘蛛牌 dfs
最新推荐文章于 2019-05-03 15:39:16 发布