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 }

 

 

你可能感兴趣的:(HDU)