HDU2181 哈密顿绕行世界问题 DFS

               
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
 

Sample Input
 
  
2 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 Output
 
  
1:  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
 
 
这道题看输出这么长还差点被吓到了,其实也只是一道简单的DFS,题目需要我们输出以一个点出发,最后回到这个点的所有路径,所以只要暴力搜索即可
 
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int map[25][5];int vis[25];int ans[25];int cas = 1;int n,m;void dfs(int m,int len,int c){    int i,j;    vis[m] = 1;    ans[len] = m;    for(i = 0; i<3; i++)    {        int t = map[m][i];        if(t == c && len == 19)        {            printf("%d:  ",cas++);            for(j = 0; j<20; j++)                printf("%d ",ans[j]);            printf("%d\n",c);        }        if(!vis[t])            dfs(t,len+1,c);    }    vis[m] = 0;}int main(){    int i;    for(i = 1; i<=20; i++)        scanf("%d%d%d",&map[i][0],&map[i][1],&map[i][2]);    while(~scanf("%d",&m),m)    {        memset(vis,0,sizeof(vis));        dfs(m,0,m);    }    return 0;}

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值