HDU 2181 哈密顿绕行世界问题

博客围绕规则实心十二面体展开,其20个顶点代表20个城市。给出输入输出要求,输入为各城市相邻信息及起始城市编号,输出是从指定城市出发遍历所有城市一次并返回的路线。采用深度优先搜索算法,用数组记录走过的路,步数达20步时打印路线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。
Input
前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出.
Output
输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

搜索,深度优先

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
#include <cmath>
using namespace std;
int x[21][3]={0},num,ans[21]={0},lu[21]={0},keyy;

int f(int n,int key)
{
    if(n==20&&ans[keyy]==0)
    {
        printf("%d:  ",num++);
        int i;
        for(i=0;i<20;i++)
            printf("%d ",lu[i]);
            printf("%d",keyy);
        printf("\n");
        return 0;
    }

    ans[key]=1;lu[n]=key;

    if(ans[x[key][0]]==0)
        f(n+1,x[key][0]);
    if(ans[x[key][1]]==0)
        f(n+1,x[key][1]);
    if(ans[x[key][2]]==0)
        f(n+1,x[key][2]);

    ans[key]=0;lu[n]=0;
    return 0;
}


int main()
{
    int i,j,key;

    for(i=1;i<=20;i++)
    {
        scanf("%d",&x[i][0]);
        scanf("%d",&x[i][1]);
        scanf("%d",&x[i][2]);
    }


    while(1)
    {
        num=1;
        ans[0]=0;ans[1]=0;ans[2]=0;ans[3]=0;ans[4]=0;
        ans[5]=0;ans[6]=0;ans[7]=0;ans[8]=0;ans[9]=0;
        ans[10]=0;ans[11]=0;ans[12]=0;ans[13]=0;ans[14]=0;
        ans[15]=0;ans[16]=0;ans[17]=0;ans[18]=0;ans[19]=0;ans[20]=0;
        scanf("%d",&key);
        if(key==0)
            break;
            lu[0]=key;
            keyy=key;
        f(1,x[key][0]);
        f(1,x[key][1]);
        f(1,x[key][2]);
    }


	return 0;
}

搜索
用数组存储走过的路,走过的标记并不再走,若步数达到20布即已经走遍所有,打印。
第一个与最后一个题目已经给出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值