题意是在蜘蛛纸牌的背景下求 10 个数的最小移动距离。
在数组中存储 10 个数字各自的位置,用深搜回溯的方法求解。
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int ans,a[20]; 4 bool vis[20]; 5 void dfs(int num,int sum) 6 { 7 if(sum > ans) return; 8 if(num == 9) 9 { 10 ans = sum; 11 return; 12 } 13 for(int i = 1; i <= 10; ++i) 14 { 15 if(!vis[i]) 16 { 17 vis[i] = 1; 18 for(int j = i+1; j <= 10; ++j) 19 { 20 if(!vis[j]) 21 { 22 dfs(num+1,sum+abs(a[i]-a[j])); 23 break; 24 } 25 } 26 vis[i] = 0; 27 } 28 } 29 } 30 int main() 31 { 32 int t,tmp; 33 scanf("%d",&t); 34 while(t--) 35 { 36 for(int i = 1; i <= 10; ++i) 37 { 38 scanf("%d",&tmp); 39 a[tmp] = i; 40 } 41 memset(vis,0,sizeof(vis)); 42 ans = 1000000; 43 dfs(0,0); 44 printf("%d ",ans); 45 } 46 return 0; 47 }
向这些博客的作者表示感谢: