蜘蛛牌------和 上一个 戒指 差不多

.....然而 还是  不会  , 看别人的程序看了半天   自己 也是仅仅能模仿一下 ,   不懂到底是咋回事////////还是要看的  先附上  题目和代码

 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
",result);
64     }
65 }
原文地址:https://www.cnblogs.com/A-FM/p/5257089.html