哈密顿绕行世界问题
Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status
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);} }//妈的,写的真清晰,爽
转载于:https://www.cnblogs.com/Romantic-Chopin/p/10253145.html