//给一个地图由起点到点最短步数 .通*不通
//标准广搜模版题
#include<bits/stdc++.h>
using namespace std;
char mp[103][103]; //地图大小
int vis[103][103]; //访问标记
typedef struct point pt; //点重命名
struct point{int x;int y;}; //点结构体
typedef pair<pt,int> p; //pair存点与距离,方便队列
int dx[4]={0,0,-1,1}; //X偏移,上下左右
int dy[4]={1,-1,0,0}; //Y偏移,上下左右
int main(){
int n,m;cin>>n>>m; //地图大小
pt s,g; //定义起点与终点
for(int i=1;i<=n;i++){ //遍历行
for(int j=1;j<=m;j++){ //遍历列
cin>>mp[i][j]; //输入
if(mp[i][j]=='s'){ //如果是起点
s.x=i; //记下X
s.y=j; //记下Y
}
if(mp[i][j]=='g'){//如果是终点
g.x=i; //记下X
g.y=j; //记下Y
}
}
}
queue<p>qu; //开队列
qu.push(p(s,0)); //压入起点
while(!qu.empty()){ //非空
pt nowp=qu.front().first; //读出队首点
int dis=qu.front().second; //读出队首点到起点步数
vis[nowp.x][nowp.y]=1; //打上已访问标记
qu.pop(); //弹出队首
if(nowp.x==g.x&&nowp.y==g.y){cout<<dis<<endl;return 0;} //到终点跳出
for(int i=0;i<4;i++){ //未到终点则四个方向偏移
pt newp; //定义新点
newp.x=nowp.x+dx[i];if(newp.x<1 || newp.x>n)continue; //得新X,超限跳过
newp.y=nowp.y+dy[i];if(newp.y<1 || newp.y>m)continue; //得新Y,超限跳过
if(vis[newp.x][newp.y]==0&&mp[newp.x][newp.y]!='*'){ //未访问且可行
qu.push(p(newp,dis+1)); //新点压入队列
}
}
}
cout<<"impossible"<<endl; //队空都走不到,就肯定走不到了
return 0;
}
/*
in
3 3
s..
...
g..
out
2
in
3 3
s..
**.
g..
out
6
in
3 3
s..
***
g..
out
impossible
*/
BFS
最新推荐文章于 2024-04-21 16:54:33 发布