HDU2181 哈密顿绕行世界问题

题目:

一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。 

输入:

前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. 

输出:

输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output 

 样例:

分析:DFS回溯,注意题目要求的是回路

 1 #include<iostream>
 2 #include<sstream>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<string>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<functional>
 9 #include<iomanip>
10 #include<numeric>
11 #include<cmath>
12 #include<queue>
13 #include<vector>
14 #include<set>
15 #include<cctype>
16 #define PI acos(-1.0)
17 const int INF = 0x3f3f3f3f;
18 const int NINF = -INF - 1;
19 typedef long long ll;
20 using namespace std;
21 int map[25][5];
22 int m, rec;
23 int vis[25];
24 int ans[25];
25 void dfs(int x, int t)
26 {
27     for (int i = 0; i < 3; ++i)
28     {
29         if (t == 19 && map[x][i] == m)
30         {
31             cout << ++rec << ":  ";
32             for (int i = 0; i < 20; ++i)
33                 cout << ans[i] << ' ';
34             cout << m << endl;
35             return;
36         }
37         if (!vis[map[x][i]])
38         {
39             vis[map[x][i]] = 1;
40             ans[t + 1] = map[x][i];
41             dfs(map[x][i], t + 1);
42             vis[map[x][i]] = 0;
43         }
44     }
45 }
46 int main()
47 {
48     for (int i = 1; i <= 20; ++i)
49         cin >> map[i][0] >> map[i][1] >> map[i][2];
50     while (cin >> m)
51     {
52         if (m == 0) break;
53         memset(vis, 0, sizeof(vis));
54         vis[m] = 1;
55         ans[0] = m;
56         rec = 0;
57         dfs(m, 0);
58     }
59     return 0;
60 }

 

posted @ 2019-06-13 22:02  Veasky  阅读(483)  评论(0编辑  收藏  举报