bfs+记录层数(利用一个数组记录到达maze[i][j]所需要走的路径(layer[i][j]=来处+1),因为每个点只经过一次,所以layer[i][j]记录的一定是最短的路径长度)
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
int maze[110][110];
int layer[110][110];//存储到达某点的最短路径长度,一旦杯赋值,就一定是到达这个点的最短路径长度
queue<pair<int,int>> que;
int fx[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int bfs(int x,int y){
que.push({x,y});
maze[x][y]=1;
layer[x][y]=0;
while(!que.empty()){
auto t=que.front();
que.pop();
for(int i=0;i<4;i++){
int a=t.first+fx[i][0],b=t.second+fx[i][1];
if(maze[a][b]==0&&(a<=n&&a>0)&&(b<=m&&b>0)){
que.push({a,b});
layer[a][b]=layer[t.first][t.second]+1;
maze[a][b]=1;
}
}
}
return layer[n][m];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>maze[i][j];
}
}
cout<<bfs(1,1);
return 0;
}
拓展:求路径(开一个数组记录一下每个点是从哪个点过来的) 不能记录每个点的后一个点,因为一个点可能有多个可选路径,而一个点只会有一个前点。
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m;
int maze[110][110];
int layer[110][110];//存储到达某点的最短路径长度,一旦杯赋值,就一定是到达这个点的最短路径长度
pair<int,int> previ[110][110];
queue<pair<int,int>> que;
int fx[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int bfs(int x,int y){
que.push({x,y});
maze[x][y]=1;
layer[x][y]=0;
while(!que.empty()){
auto t=que.front();
que.pop();
for(int i=0;i<4;i++){
int a=t.first+fx[i][0],b=t.second+fx[i][1];
if(maze[a][b]==0&&(a<=n&&a>0)&&(b<=m&&b>0)){
previ[a][b]=t;
que.push({a,b});
layer[a][b]=layer[t.first][t.second]+1;
maze[a][b]=1;
}
}
}
int a=n,b=m;
while(a!=1||b!=1){
cout<<a<<" "<<b;
auto t=previ[a][b];
a=t.first;
b=t.second;
}
return layer[n][m];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>maze[i][j];
}
}
cout<<bfs(1,1);
return 0;
}