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 }
常常因身处温室而不自知,因而懈怠;
及时当勉励,岁月不待人!