C++
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N=110;
int n,m;
int g[N][N]; //g数组存地图
int d[N][N]; //d数组存每一个点到起点的距离
PII q[N*N]; //定义一个队列,记录走过的路径
int bfs()
{
int hh=0,tt=0; //初始化队列,对头队尾都是0
q[0]={0,0};
memset(d,-1,sizeof d); //把所有距离初始为-1
d[0][0]=0; //距离是0表示已经走过了
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; //用向量的形式表示往四个方向扩展
while(hh<=tt){ //队列不空
auto t = q[hh++]; //auto自动类型判断,用于对象声明 //每次取出队头元素
for(int i=0;i<4;i++) //四个方向
{
int x=t.first+dx[i],y=t.second+dy[i]; //x表示沿着这个方向走,可以走到哪个点
if(x>=0 && x<n && y>=0 && y<m && g[x][y]==0 && d[x][y]==-1) //在边界内&&当前点是0&&当前点没有被搜过。bfs是第一次搜到的点才是最短距离。
{
d[x][y]=d[t.first][t.second]+1; //stl的pair类型容器,每个容器装两个量(可自定义),第一个是.first,第二个是.second
q[++tt]={x,y};
}
}
}
return d[n-1][m-1]; //输出右下角这个点的距离
}
int main()
{
cin>>n>>m;
for (int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin >> g[i][j];
cout << bfs() <<endl;
return 0;
}
Python
def bfs():
q=[[0,0] for _ in range(m*n)] #q记录走过的路径
hh=tt=0
dx=[-1,0,1,0] #向量表示往四个方向走
dy=[0,1,0,-1]
while hh<=tt: #队列不为空
t=q[hh] #取出队头元素
hh+=1
for i in range(4): #从当前点出发往四个方向走
x=t[0]+dx[i] #即将走的点的坐标
y=t[1]+dy[i]
if (x<n and x>=0 and y<m and y>=0 and d[x][y]==0 and ditu[x][y]==0):
#即将走的点 在范围内 and 没走过 and 在地图上可以走
d[x][y]=d[t[0]][t[1]]+1 #记录该点的距离
tt+=1
q[tt]=[x,y] #存入走过的路径列表
return d[n-1][m-1]
if __name__=='__main__':
n,m=map(int,input().split())
ditu=[list(map(int,input().split())) for _ in range(n)] #存地图
d=[[0]*m for _ in range(n)] #存每一个点到起始点的距离
print(bfs())