C++
#include
#include
#include
using namespace std;
typedef pair 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=0 && y>n>>m;
for (int i=0;i> g[i][j];
cout << bfs() <
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=0 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())