广度优先搜索题目
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 60
struct node
{
int a,b,c;
int time;
}cur,next;
int mark[N][N][N],n;
char map[N][N];
int bfs()
{
int i;
queue<node> q;
memset(mark,0,sizeof(mark));
cur.time=0;
mark[cur.a][cur.b][cur.c]=1;
if(cur.a==cur.b&&cur.b==cur.c) return 0;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
for(i=1;i<=n;i++)
{
if(map[cur.a][i]==map[cur.b][cur.c]&&
!mark[i][cur.b][cur.c])
{
mark[i][cur.b][cur.c]=1;
next.time=cur.time+1;
next.a=i;next.b=cur.b;next.c=cur.c;
if(next.a==next.b&&next.b==next.c)
return next.time;
q.push(next);
}
if(map[cur.b][i]==map[cur.a][cur.c]&&
!mark[cur.a][i][cur.c])
{
mark[cur.a][i][cur.c]=1;
next.time=cur.time+1;
next.a=cur.a;
next.b=i;
next.c=cur.c;
if(next.a==next.b&&next.b==next.c)
return next.time;
q.push(next);
}
if(map[cur.c][i]==map[cur.b][cur.a]&&
!mark[cur.a][cur.b][i])
{
mark[cur.a][cur.b][i]=1;
next.time=cur.time+1;
next.a=cur.a;
next.b=cur.b;
next.c=i;
if(next.a==next.b&&next.b==next.c)
return next.time;
q.push(next);
}
}
}
return -1;
}
int main()
{
int i,j;
while(scanf("%d",&n),n)
{
scanf("%d%d%d",&cur.a,&cur.b,&cur.c);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>map[i][j];
}
}
int x=bfs();
if(x!=-1) printf("%d\n",x);
else printf("impossible\n");
}
return 0;
}
本文介绍了一个使用C++实现的广度优先搜索(BFS)算法案例。该算法应用于寻找从起点到终点的最短路径问题,特别适用于解决涉及图遍历的问题。文中详细展示了如何定义节点结构体、设置标记数组来避免重复访问以及使用队列来存储待处理节点的过程。
6336

被折叠的 条评论
为什么被折叠?



