蜘蛛牌------和 上一个 戒指 差不多
.....然而 还是 不会 , 看别人的程序看了半天 自己 也是仅仅能模仿一下 , 不懂到底是咋回事////////还是要看的 先附上 题目和代码
1 /* 2 做错了 两个地方 , 3 1: 4 */ 5 6 #include<stdio.h> 7 #include<string.h> 8 #include<math.h> 9 #include<iostream> 10 #include<algorithm> 11 #include<queue> 12 #include<vector> 13 #include<set> 14 #include<stack> 15 #include<string> 16 #include<sstream> 17 #include<map> 18 #include<cctype> 19 #include<limits.h> 20 using namespace std; 21 int a[11],visited[11],result; 22 void DFS(int t,int tem) //已经做好的 卡牌 和 目前的 值 . 23 { 24 if(tem>=result) // 当 目前的移动步数 大于 了 最小的步数 就剪掉 . 25 return ; 26 if(t==10) 27 { 28 result=tem; 29 return; 30 } 31 for(int i=1;i<11;i++) // 较小的 牌面 32 { 33 if(!visited[i]) //这一张卡牌没有用 . 34 { 35 for(int j=i+1;j<11;j++) 36 { 37 if(!visited[j]) 38 { 39 visited[i]=1; 40 DFS(t+1,tem+abs(a[i]-a[j])); // 41 visited[i]=0; 42 break; // 有时候 不行 , 不能 从 1 到 10 连着放牌 , 可能将后面的牌 先放一下 , 会减少步数 . 那就 现弄后面的 . 43 } // 例如 1 2 3 4 5 10 9 8 7 6 先 弄后面的 会更好 44 } 45 } 46 } 47 } 48 int main() 49 { 50 int t; 51 scanf("%d",&t); 52 while(t--) 53 { 54 for(int i=1;i<11;i++) 55 { 56 int card; 57 scanf("%d",&card); 58 a[card]=i; //牌面做下标 59 visited[i]=0; 60 } 61 result=INT_MAX; 62 DFS(1,0); // 移动 9 次就搞定了. . 63 printf("%d\n",result); 64 } 65 }