解题思路:哈密顿环游世界问题。一道简单的题目,用回溯。
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 }