//bfs是队列,dfs是递归
#include<iostream>
#include<cstring>//使用memset时需要加这个
using namespace std;
typedef pair<int,int>PII;//在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同
const int N=110;
int map[N][N],s[N][N];//存地图和距离原点的距离;
int m,n;
PII q[N*N];//手写队列
int bfs(){
q[0]={0,0};
int hh=0,tt=0;
memset(s,-1,sizeof s);//距离初始化为- 1表示没有走过
s[0][0]=0;
int dx[4]={0,-1,0,1},dy[4]={1,0,-1,0};//右、上、左、下
while(hh<=tt){
PII t=q[hh++];//取队头元素
for(int i=0;i<4;i++){
int x=t.first+dx[i],y=t.second+dy[i];//x表示沿着此方向走会走到哪个点
if(x>=0&&x<m&&y>=0&&y<n&&map[x][y]==0&&s[x][y]==-1){//在地图内 并且是空地可以走 且之前没有走过
s[x][y]=s[t.first][t.second]+1;//到起点的距离
q[++tt]={x,y};//新坐标入队
}
}
}return s[m-1][n-1];//返回右下角的坐标
}
int main(){
cin>>m>>n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>map[i][j];
cout<<bfs()<<endl;
return 0;
}
输出路径
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int m,n;
typedef pair<int ,int>PII;
PII q[N*N],path[N][N];
int map[N][N],s[N][N];
int bfs()
{
int hh=0,tt=0;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
q[0]={0,0};
memset(s,-1,sizeof s);
s[0][0]=0;
while(hh<=tt)
{
auto t=q[hh++];
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x>=0&&x<m&&y>=0&&y<n&&map[x][y]==0&&s[x][y]==-1)
{
s[x][y]=s[t.first][t.second]+1;
q[++tt]={x,y};
path[x][y]=t;//记录xy这两个点从哪里来的
}
}
}
int x = n-1, y = m - 1;
// while(x||y)//有一个不d等于0
while(x||y)
{
cout << x << ' ' << y << endl;
auto t = path[x][y];
x = t.first; y = t.second;
cout<<x<<" "<<y<<endl;
}
return s[m-1][n-1];
}
int main(){
cin>>m>>n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>map[i][j];
cout<<bfs()<<endl;
return 0;
}