HDU 1584 蜘蛛牌(dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1584
因为蜘蛛牌是小的牌在大的牌上面,所以可以从小的牌开始找,10张牌9次排序一定可以排完,当前步数大于等于已经找到的最短步数也没有必要。
每一次找到没有排好的牌,找到他改排到的位置,因为只有一种能排的方法,所以找到后要退出当前循环,不然可能会出错
#include<bits/stdc++.h>
using namespace std;
int num[15],vis[15],minn;
inline void dfs(int v,int step){
if(step>=minn)return;
if(v==9){
minn=step;
return;
}
for(int i=1;i<=10;i++){
if(vis[i]==0){
vis[i]=1;
for(int j=i+1;j<=10;j++){
if(vis[j]==0){
dfs(v+1,step+abs(num[i]-num[j]));
break;
}
}
vis[i]=0;
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
for(int i=0;i<=9;i++){
int ans;
scanf("%d",&ans);
num[ans]=i;
vis[i]=0;
}
minn=100000;
dfs(0,0);
printf("%d\n",minn);
}
return 0;
}