题面 走迷宫 题目描述 一个迷宫由 R R 行 C C 列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。
给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。
输入格式 第一行是两个整数, R R 和 C C,代表迷宫的长和宽。 ( 1 ≤ R , C ≤ 40 ) (1≤R,C≤40)
接下来是 R R行,每行 C C个字符,代表整个迷宫。
空地格子用‘.’表示,有障碍物的格子用‘#’表示。
迷宫左上角和右下角都是‘.’。
输出格式 输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。
输入数据 1 5 5 ..### #.... #.#.# #.#.# #.#.. 输出数据 1 9 代码
//author Hu Huanrui Harry
//P0420
#include<bits/stdc++.h>
using namespace std;
int n,k,m;
char zz[50][50];
int vis[50][50];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
struct point{
int x;
int y;
};
void bfs(int x,int y){
queue<point>q;
q.push({x,y});
zz[x][y]='#';
vis[1][1]=1;
while(q.size()>0){
point u=q.front();
q.pop();
if(u.x==n&&u.y==m){
cout<<vis[n][m]<<endl;
break;
}for(int i=0;i<=3;i++){
int xx=u.x+dx[i];
int yy=u.y+dy[i];
if(xx<=n&&xx>=1&&yy<=m&&yy>=1&&zz[xx][yy]=='.'){
q.push({xx,yy});
zz[xx][yy]='#';
vis[xx][yy]=vis[u.x][u.y]+1;
}
}
}
}int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>zz[n][m];
}
}bfs(1,1);
return 0;
}```cpp
求助