哈密顿绕行世界问题
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1039 Accepted Submission(s): 643
Problem 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
http://acm.hdu.edu.cn/showproblem.php?pid=2181
1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 8 struct node 9 { 10 int a[3]; 11 }f[22]; 12 bool hash[22]; 13 int stack[22]; 14 int s,t; 15 16 void dfs(int m,int cur) 17 { 18 int i,k; 19 if(cur==21 && m==s) 20 { 21 for(i=0;i<21;i++) 22 { 23 if(i!=0)printf(" "); 24 else printf("%d: ",++t); 25 printf("%d",stack[i]); 26 } 27 printf(" "); 28 } 29 30 for(i=0;i<3;i++) 31 { 32 k=f[m].a[i]; 33 if(hash[k]==false) 34 { 35 hash[k]=true; 36 stack[cur]=k; 37 dfs(k,cur+1); 38 hash[k]=false; 39 } 40 else if(k==s && cur==20) 41 { 42 stack[cur]=k; 43 dfs(k,cur+1); 44 } 45 } 46 } 47 int main() 48 { 49 int i; 50 while(scanf("%d",&f[1].a[0])>0) 51 { 52 if(f[1].a[0]==0)break; 53 scanf("%d%d",&f[1].a[1],&f[1].a[2]); 54 for(i=2;i<=20;i++) 55 scanf("%d%d%d",&f[i].a[0],&f[i].a[1],&f[i].a[2]); 56 57 for(i=1;i<=20;i++) 58 sort(f[i].a,f[i].a+3); 59 scanf("%d",&s); 60 memset(hash,false,sizeof(hash)); 61 hash[s]=true; 62 stack[0]=s; 63 t=0; 64 dfs(s,1); 65 } 66 return 0; 67 }