【算法】哈密顿环绕世界
一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。
输入前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出.
产量输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output
#include<iostream> #include<stdio.h> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; struct node { int a[3]; }f[22]; bool hash[22]; int stack[22]; int s,t; void dfs(int m,int cur) { int i,k; if(cur==21 && m==s) { for(i=0;i<21;i++) { if(i!=0)printf(" "); else printf("%d: ",++t); printf("%d",stack[i]); } printf("\n"); } for(i=0;i<3;i++) { k=f[m].a[i]; if(hash[k]==false) { hash[k]=true; stack[cur]=k; dfs(k,cur+1); hash[k]=false; } else if(k==s && cur==20) { stack[cur]=k; dfs(k,cur+1); } } } int main() { int i; while(scanf("%d",&f[1].a[0])>0) { if(f[1].a[0]==0)break; scanf("%d%d",&f[1].a[1],&f[1].a[2]); for(i=2;i<=20;i++) scanf("%d%d%d",&f[i].a[0],&f[i].a[1],&f[i].a[2]); for(i=1;i<=20;i++) sort(f[i].a,f[i].a+3); scanf("%d",&s); memset(hash,false,sizeof(hash)); hash[s]=true; stack[0]=s; t=0; dfs(s,1); } return 0; }
posted on 2017-02-18 20:46 KID_XiaoYuan 阅读(218) 评论(0) 编辑 收藏 举报