原题
题意
蜘蛛纸牌,同一花色的10张牌,随机地排列在一行上展开,整理成从小到大有序的一列,求最小移动距离。
分析
首先,对于所有的数反映射,记录其位置,然后,DFS出所有可能性(用全排列的思想),对于每一次移动,进行决策,使其移动到只比他大1的纸牌上(这个纸牌很可能已经移动,故追踪至未被移动过的根纸牌),决策完十次后,进行判断,每次取最小。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| T1:dfs中j的循环没有break出去。 */ #include <bits/stdc++.h> #define MAX 0x3f3f3f3f using namespace std; int ans; int vis[13],a[13]; void dfs(int cnt,int sum){ if(sum>ans){ return; } if(cnt==10){ ans=sum; return; } for(int i=1;i<=10;i++){ if(!vis[i]){ vis[i]=1; for(int j=i+1;j<=10;j++){ if(!vis[j]){ dfs(cnt+1,sum+fabs(a[i]-a[j])); break; } } vis[i]=0; } } } int main() { int t,x; scanf("%d",&t); while(t--){ for(int i=1;i<=10;i++){ scanf("%d",&x); a[x]=i; } memset(vis,0,sizeof(vis)); ans=MAX; dfs(1,0); printf("%d\n",ans); } return 0; }
|