基础的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);//搜索
}
}