HDU-2181 哈密顿绕行世界问题 (BFS 广度优先搜索)

基础的BFS 本人用的结构体保存路径信息 STL队列进行搜索

代码都有注释 (水平不高 欢迎大佬指点)

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int maps[25][3];//地图 maps[i][j]表示j与i相邻
int m;
int ans;//路径数
struct node
{
    int index,num;//index表已经走了(index+1)个城市 num表当前城市
    int step[25],vis[25];//step数组表路径 vis数组表城市是否经过(一个城市只能经过一次)
};

//输出路径
void out(node a)
{
    printf("%d:  ",ans++);
    for(int i=0; i<=a.index; i++)
        printf("%d ",a.step[i]);
    printf("%d\n",m);
}

//检查路径是否符合要求
int check(node a)
{
    for(int i=1; i<=20; i++)
        if(!a.vis[i])
            return 0;//所有城市都要经过一次
    int flag=0;
    for(int i=0; i<3; i++)
        if(maps[a.num][i]==m)
            flag=1;//最后经过的城市需可以到达出发城市
    if(flag)
        return 1;
    return 0;
}



void bfs(int n)
{
    queue<node>q;//搜索队列
    node now;//出发城市
    now.num=n;
    now.index=0;
    now.step[now.index]=n;//路径加入
    memset(now.vis,0,sizeof(now.vis));
    now.vis[n]=1;//将出发城市设为已经过
    q.push(now);//队头
    while(!q.empty())//不为空则一直搜索
    {
        now=q.front();//队头
        if(check(now))//检查是否符合条件
        {
            out(now);//输出路径
        }
        q.pop();//出队
        for(int i=0; i<3; i++)//每个城市有三个相邻城市  将三个城市都入队搜索
            if(!now.vis[maps[now.num][i]])
            {
                node next;//当前城市的相邻城市
                next.num=maps[now.num][i];
                for(int i=0; i<=now.index; i++)
                    next.step[i]=now.step[i];//路径复制
                for(int i=0; i<=20; i++)
                    next.vis[i]=now.vis[i];//经过的城市的复制
                next.index=now.index;//经过城市数目
                next.index++;//数目加一
                next.step[next.index]=next.num;//将此城市城市加入路径
                next.vis[next.num]=1;//将此城市设为已经过
                q.push(next);//入队
            }
    }
}

int main()
{
    for(int i=1; i<=20; i++)
        for(int j=0; j<=2; j++)
            scanf("%d",&maps[i][j]);//地图录入
    while(scanf("%d",&m)&&m)//多组输入
    {
        ans=1;//路径数
        bfs(m);//搜索
    }
}

 

猜你喜欢

转载自blog.csdn.net/ySFRaabbcc/article/details/80548676