hdu 2181 水搜索

哈密顿绕行世界问题

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("\n");
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 }

 

 
posted @ 2014-04-13 19:48  芷水  阅读(255)  评论(0编辑  收藏  举报