#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
int beginx,beginy,endx,endy;
int nextx,nexty;
int r,c;
int t;
int vis[205][205];
char gg[205][205];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
struct Node{
int x;
int y;
int day;
Node(){ //必须有无参构造
}
Node (int xx,int yy,int dayy) //定义结构体
{
x=xx;
y=yy;
day=dayy;
}
}beginn;
queue<Node> qq;
bool isVital(int xx,int yy)
{
if( (xx>=0 && xx<r)&& (yy>=0 && yy<c) && gg[xx][yy]!='#') //注意先判断 xx,yy的范围
{
return 1;
}
return 0;
}
void bfs()
{
memset(vis,0,sizeof(vis));
beginn.x=beginx;
beginn.y=beginy;
beginn.day=0;
vis[beginx][beginy]=1;
while(!qq.empty())
{
qq.pop();
}
qq.push(beginn);
while(!qq.empty())
{
Node ff=qq.front();
qq.pop();
for(int i=0;i<4;i++)
{
nextx=ff.x+dir[i][0];
nexty=ff.y+dir[i][1];
if(isVital(nextx,nexty) && !vis[nextx][nexty]) //合法且未访问过
{
if(nextx==endx && nexty==endy)
{
printf("%d\n",ff.day+1);
return;
}
vis[nextx][nexty]=1;
// cout<<nextx<<" "<<nexty<<endl;
qq.push(Node(nextx,nexty,ff.day+1));
}
}
}
printf("oop!\n");
}
int main()
{
cin>>t;
while(t--)
{
scanf("%d%d",&r,&c);
// getchar(); //如果scanf 读取字符,注意scanf c会读取换行符
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cin>>gg[i][j];
// cout<<gg[i][j];
if(gg[i][j]=='S')
{
beginx=i;
beginy=j;
}else if(gg[i][j]=='E')
{
endx=i;
endy=j;
}
}
// getchar();
}
bfs();
}
return 0;
}
献给阿尔吉侬的花束 bfs !!!
最新推荐文章于 2024-05-13 19:56:01 发布
本文详细解析了一个基于广度优先搜索(BFS)算法的经典迷宫寻路问题实现。通过C++代码示例展示了如何利用队列进行节点遍历,寻找从起点到终点的最短路径。介绍了BFS算法的基本原理、关键数据结构如节点结构体及访问标记数组,并通过具体代码实现展示了如何判断节点的有效性及遍历过程。
摘要由CSDN通过智能技术生成