HDU 1584:蜘蛛牌(DFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1584

题意:要让小的牌放到大的牌上面最少移动的距离。

思路:看成让大的牌放在小的牌上面了。。。用一个标记数组vis判断该点是否移动了。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <queue>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <stack>
12 using namespace std;
13 #define INF 0x3f3f3f3f
14 typedef long long LL;
15 int pos[15], vis[15], ans;
16 
17 void dfs(int u, int sum) {
18     if(u == 10) { // 如果9张牌都动过了,就得到答案了
19         ans = min(ans, sum); return ;
20     }
21     for(int i = 1; i <= 10; i++) {
22         if(!vis[i]) { // 如果这张牌没动过
23             vis[i] = 1; // 让他放到比它大的牌的上面
24             for(int j = i + 1; j <= 10; j++) {
25                 if(!vis[j]) { // 如果这张牌没动过,那么可以放
26                     // 相当于把i这张牌放到j这张牌上面
27                     dfs(u + 1, sum + abs(pos[j] - pos[i]));
28                     break;
29                 }
30             }
31             vis[i] = 0;
32         }
33     }
34 }
35 
36 int main() {
37     int t;
38     scanf("%d", &t);
39     while(t--) {
40         memset(vis, 0, sizeof(vis));
41         int a; ans = INF;
42         for(int i = 1; i <= 10; i++) scanf("%d", &a), pos[a] = i;
43         dfs(1, 0);
44         printf("%d
", ans);
45     }
46     return 0;
47 }
原文地址:https://www.cnblogs.com/fightfordream/p/6384616.html