哈密顿绕行世界问题
Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。
Input
前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出.
Output
输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output
#include<iostream> #include<cstring> using namespace std; bool map[21][21]; //城市地图 bool vis[21]; //是否访问过该城市 int ans[21]; //记录走过的城市 int num; int start_city;//起始的出发城市 void dfs(int deepth,int count) //deepth是当前访问的城市,count记录已经访问过多少个城市(一共要访问20个嘛) { ans[count] = deepth;//将当前城市记录下来 if (count==19) //如果已经访问了19个城市就不用访问了,因为第20个城市就是刚开始出发的城市嘛 { if (map[deepth][cas]==true)//假如第19个城市与第20个(也就是第一个出发点)城市相连 { cout<<num++<<": "; for (int i=0;i<=19;i++) cout<<ans[i]<<" "; cout<<ans[0]<<endl;//打印答案 } return ; } for (int j=1;j<=20;j++)//遍历第一个到第20个城市 { if (map[deepth][j]==true && vis[j]==false) //如果第deepth个城市与第j个城市相连,而第j个城市没被访问过 { vis[j]=true; dfs(j,count+1);//下一次递归 vis[j]=false; } } } int main() { int a,b,c; memset(map,0,sizeof(map)); for (int i=1;i<=20;i++) { cin>>a>>b>>c; map[i][a]=true;//表示第i个城市与第a个城市相连 map[i][b]=true;//表示第i个城市与第b个城市相连 map[i][c]=true;//表示第i个城市与第c个城市相连 } while (cin>>cas && cas) { num=1; memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); vis[start_city] = true; dfs(strat_city,0); } }//妈的,写的真清晰,爽