HDU 1584(蜘蛛牌 DFS)

题意是在蜘蛛纸牌的背景下求 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\n",ans);
45     }
46     return 0;
47 }
View Code

向这些博客的作者表示感谢:

https://blog.csdn.net/flynn_curry/article/details/50775604

https://www.cnblogs.com/yanqi110/articles/4928285.html

posted @ 2018-09-21 21:55  Taskr  阅读(257)  评论(0编辑  收藏  举报
Live2D