HDOJ 2181 哈密顿绕行世界问题 (dfs)

来源:互联网 发布:iphone软件灰色删不掉 编辑:程序博客网 时间:2024/06/06 14:30
一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。
 
Input
前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出.
 
Output
输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output
Sample Input2 5 201 3 122 4 103 5 81 4 65 7 196 8 174 7 98 10 163 9 1110 12 152 11 1312 14 2013 15 1811 14 169 15 177 16 1814 17 196 18 201 13 1950
Sample Output1:  5 1 2 3 4 8 7 17 18 14 15 16 9 10 11 12 13 20 19 6 52:  5 1 2 3 4 8 9 10 11 12 13 20 19 18 14 15 16 17 7 6 53:  5 1 2 3 10 9 16 17 18 14 15 11 12 13 20 19 6 7 8 4 54:  5 1 2 3 10 11 12 13 20 19 6 7 17 18 14 15 16 9 8 4 55:  5 1 2 12 11 10 3 4 8 9 16 15 14 13 20 19 18 17 7 6 56:  5 1 2 12 11 15 14 13 20 19 18 17 16 9 10 3 4 8 7 6 57:  5 1 2 12 11 15 16 9 10 3 4 8 7 17 18 14 13 20 19 6 58:  5 1 2 12 11 15 16 17 18 14 13 20 19 6 7 8 9 10 3 4 59:  5 1 2 12 13 20 19 6 7 8 9 16 17 18 14 15 11 10 3 4 510:  5 1 2 12 13 20 19 18 14 15 11 10 3 4 8 9 16 17 7 6 511:  5 1 20 13 12 2 3 4 8 7 17 16 9 10 11 15 14 18 19 6 512:  5 1 20 13 12 2 3 10 11 15 14 18 19 6 7 17 16 9 8 4 513:  5 1 20 13 14 15 11 12 2 3 10 9 16 17 18 19 6 7 8 4 514:  5 1 20 13 14 15 16 9 10 11 12 2 3 4 8 7 17 18 19 6 515:  5 1 20 13 14 15 16 17 18 19 6 7 8 9 10 11 12 2 3 4 516:  5 1 20 13 14 18 19 6 7 17 16 15 11 12 2 3 10 9 8 4 517:  5 1 20 19 6 7 8 9 10 11 15 16 17 18 14 13 12 2 3 4 518:  5 1 20 19 6 7 17 18 14 13 12 2 3 10 11 15 16 9 8 4 519:  5 1 20 19 18 14 13 12 2 3 4 8 9 10 11 15 16 17 7 6 520:  5 1 20 19 18 17 16 9 10 11 15 14 13 12 2 3 4 8 7 6 521:  5 4 3 2 1 20 13 12 11 10 9 8 7 17 16 15 14 18 19 6 522:  5 4 3 2 1 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 523:  5 4 3 2 12 11 10 9 8 7 6 19 18 17 16 15 14 13 20 1 524:  5 4 3 2 12 13 14 18 17 16 15 11 10 9 8 7 6 19 20 1 525:  5 4 3 10 9 8 7 6 19 20 13 14 18 17 16 15 11 12 2 1 526:  5 4 3 10 9 8 7 17 16 15 11 12 2 1 20 13 14 18 19 6 527:  5 4 3 10 11 12 2 1 20 13 14 15 16 9 8 7 17 18 19 6 528:  5 4 3 10 11 15 14 13 12 2 1 20 19 18 17 16 9 8 7 6 529:  5 4 3 10 11 15 14 18 17 16 9 8 7 6 19 20 13 12 2 1 530:  5 4 3 10 11 15 16 9 8 7 17 18 14 13 12 2 1 20 19 6 531:  5 4 8 7 6 19 18 17 16 9 10 3 2 12 11 15 14 13 20 1 532:  5 4 8 7 6 19 20 13 12 11 15 14 18 17 16 9 10 3 2 1 533:  5 4 8 7 17 16 9 10 3 2 1 20 13 12 11 15 14 18 19 6 534:  5 4 8 7 17 18 14 13 12 11 15 16 9 10 3 2 1 20 19 6 535:  5 4 8 9 10 3 2 1 20 19 18 14 13 12 11 15 16 17 7 6 536:  5 4 8 9 10 3 2 12 11 15 16 17 7 6 19 18 14 13 20 1 537:  5 4 8 9 16 15 11 10 3 2 12 13 14 18 17 7 6 19 20 1 538:  5 4 8 9 16 15 14 13 12 11 10 3 2 1 20 19 18 17 7 6 539:  5 4 8 9 16 15 14 18 17 7 6 19 20 13 12 11 10 3 2 1 540:  5 4 8 9 16 17 7 6 19 18 14 15 11 10 3 2 12 13 20 1 541:  5 6 7 8 4 3 2 12 13 14 15 11 10 9 16 17 18 19 20 1 542:  5 6 7 8 4 3 10 9 16 17 18 19 20 13 14 15 11 12 2 1 543:  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 544:  5 6 7 8 9 16 17 18 19 20 1 2 12 13 14 15 11 10 3 4 545:  5 6 7 17 16 9 8 4 3 10 11 15 14 18 19 20 13 12 2 1 546:  5 6 7 17 16 15 11 10 9 8 4 3 2 12 13 14 18 19 20 1 547:  5 6 7 17 16 15 11 12 13 14 18 19 20 1 2 3 10 9 8 4 548:  5 6 7 17 16 15 14 18 19 20 13 12 11 10 9 8 4 3 2 1 549:  5 6 7 17 18 19 20 1 2 3 10 11 12 13 14 15 16 9 8 4 550:  5 6 7 17 18 19 20 13 14 15 16 9 8 4 3 10 11 12 2 1 551:  5 6 19 18 14 13 20 1 2 12 11 15 16 17 7 8 9 10 3 4 552:  5 6 19 18 14 15 11 10 9 16 17 7 8 4 3 2 12 13 20 1 553:  5 6 19 18 14 15 11 12 13 20 1 2 3 10 9 16 17 7 8 4 554:  5 6 19 18 14 15 16 17 7 8 9 10 11 12 13 20 1 2 3 4 555:  5 6 19 18 17 7 8 4 3 2 12 11 10 9 16 15 14 13 20 1 556:  5 6 19 18 17 7 8 9 16 15 14 13 20 1 2 12 11 10 3 4 557:  5 6 19 20 1 2 3 10 9 16 15 11 12 13 14 18 17 7 8 4 558:  5 6 19 20 1 2 12 13 14 18 17 7 8 9 16 15 11 10 3 4 559:  5 6 19 20 13 12 11 10 9 16 15 14 18 17 7 8 4 3 2 1 560:  5 6 19 20 13 14 18 17 7 8 4 3 10 9 16 15 11 12 2 1 5

code:
#include <stdio.h>typedef struct{int dir[3];}node;node row[22];int used[21], count = 0, ans[21], m = 0, k = 0;void dfs(int x){int i = 0;if(k == 19 && (row[x].dir[0] == m || row[x].dir[1] == m || row[x].dir[2]==m)){printf("%d:  ",++count);printf("%d ",m);for(i = 0; i<k; i++)printf("%d ",ans[i]);printf("%d\n",m);}else{for(i = 0; i<3; i++){if(!used[row[x].dir[i]]){ans[k++] = row[x].dir[i];used[row[x].dir[i]] = 1;dfs(row[x].dir[i]);used[row[x].dir[i]] = 0;k--;}}}}int main(){int i = 0;for(i = 1; i<21; i++)scanf("%d %d %d",&row[i].dir[0], &row[i].dir[1], &row[i].dir[2]);while(scanf("%d",&m)  , m){for(i = 1; i<21; i++)used[i] = 0;k = 0;used[m] = 1;dfs(m);}return 0;}