#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 55
const int d[][2]={{1,0},{0,-1},{0,1}};//题目的坐标偏移量
struct Node//结构体保存节点信息
{
int x,y,step;
Node(){}
Node(int a,int b,int c):x(a),y(b),step(c){}
}que[MAXN*MAXN];//队列
int n,m;//地图大小
bool vis[MAXN][MAXN];//HASH 判重表
char map[MAXN][MAXN];//地图信息
int bfs()
{
int h,t;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) vis[i][j]=false;
vis[0][0]=true;
que[h=t=0]=Node(0,0,0);//起点放入队列
while(h<=t)//如果队列不为空
{
int x=que[h].x,y=que[h].y,step=que[h++].step;
if(x==n-1 && y==m-1) return step;//找到目标点
for(int i=0;i<3;i++)
{
int tx=x+d[i][0],ty=y+d[i][1];
if(tx>=n || tx<0 || ty>=m || ty<0) continue;
if(map[tx][ty]=='*' || vis[tx][ty]) continue;
//以上两句判断当前扩展的点是否合法
vis[tx][ty]=true;//标记该状态已经生成过
que[++t]=Node(tx,ty,step+1);//新状态放入队列
}
}
return -1;//未找到目标点
}
int main()
{
while(cin>>n>>m)
{
int i,j;
for(i=0;i<n;i++) scanf("%s",map[i]);
cout<<bfs()<<endl;
}
return 0;
}
BFS示例代码
最新推荐文章于 2024-03-18 15:41:21 发布