.....然而 还是 不会 , 看别人的程序看了半天 自己 也是仅仅能模仿一下 , 不懂到底是咋回事////////还是要看的 先附上 题目和代码
1 #include<stdio.h> 2 #include<math.h> 3 #include<algorithm> 4 using namespace std; 5 int vis[11],p[11],bs,step; 6 void DFS(int t) // 寻找 第一个 需要移动的 卡片 7 { 8 int i,j; 9 if(t==10) // 10 { 11 bs=step; // 10 张牌 都找到 自己的 移动先后顺序之后记下来 跳出去 就行了 12 return ; 13 } 14 for(i=1;i<11;i++) 15 { 16 if(!vis[i]) 17 { 18 for(j=i+1;j<11;j++) // i+1 的 原因 是 控制将较小的 放到 较大的 上面 19 { 20 if(!vis[j]) //没有 被用 21 { 22 step+=abs(p[i]-p[j]); // 加上这一次 移动的步数 23 if(step<bs) 24 { 25 vis[i]=i; // 进去 将 牌 标记为 已用 26 DFS(t+1); // 开始寻找 下一次移动的 排 27 vis[i]=0; 28 } 29 step-=abs(p[i]-p[j]); 30 break; 31 } 32 } 33 } 34 } 35 } 36 int main() 37 { 38 int t,a; 39 scanf("%d",&t); 40 while(t--) 41 { 42 for(int i=1;i<11;i++) 43 { 44 scanf("%d",&a); 45 p[a]=i; // 储存下来 每一张牌的位置 46 vis[i]=0; // 没有被用的 牌 记为 0 . 47 } 48 bs=1000000; 49 step=0; 50 DFS(1); // 开始 寻找 第一个 需要移动的 卡片 51 printf("%d\n",bs); 52 } 53 54 }
时间: 2024-11-05 02:36:31