HDU2181 哈密顿绕行世界问题

解题思路:哈密顿环游世界问题。一道简单的题目,用回溯。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 24;
 6 int vis[maxn], mapp[maxn][maxn], path[maxn];
 7 int m, x, kase = 1;
 8 
 9 void Print()
10 {
11     printf("%d:  ", kase ++); //两个空格
12     for(int i = 1; i <= 20; i++)
13     {
14         printf("%d ", path[i]);
15     }
16     printf("%d
", m);
17     return ;
18 }
19 
20 //now为当前城市,num为已有的城市个数
21 void DFS(int now, int num)
22 {
23     path[num] = now; 
24     vis[now] = 1; //now标记为已经访问过
25     if(num == 20) //表示已经有20个城市
26     {
27         //如果第20个城市与m相连,则打印出来
28         if(mapp[now][m]) Print();
29     }
30     else
31     {
32         for(int i = 1; i <= 20; i++)
33         {
34             //如果这个城市没有访问过,并且与now相连,继续搜
35             if(!vis[i] && mapp[now][i]) DFS(i, num+1);
36         }
37     }
38     vis[now] = 0; //回溯
39     return ;
40 }
41 
42 int main()
43 {
44     memset(vis, 0, sizeof(vis));
45     memset(mapp, 0, sizeof(mapp));
46     for(int i = 1; i <= 20; i++)
47     {
48         for(int j = 1; j <= 3; j++)
49         {
50             scanf("%d", &x);
51             mapp[i][x] = mapp[x][i] = 1;
52         }
53     }
54     while(~scanf("%d", &m) && m)
55     {
56         DFS(m, 1);
57     }
58     return 0;
59 }
View Code
原文地址:https://www.cnblogs.com/loveprincess/p/4934064.html