#include <bits/stdc++.h>
using namespace std;
const int N=2*100+5;
int dis[N][N];
int a[N][N];
int n,m;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};
bool valid(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m&&a[x][y]==0;//看清多少row多少column
}
void bfs()
{
queue<pair<int,int>>q;
q.push({0,0});
a[0][0]=1;
while (!q.empty())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
if(valid(t.first+dx[i],t.second+dy[i]))
{
q.push({t.first+dx[i],t.second+dy[i]});
a[t.first+dx[i]][t.second+dy[i]]=1;
dis[t.first+dx[i]][t.second+dy[i]]=dis[t.first][t.second]+1;
}
}
}
printf("%d",dis[n-1][m-1]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
bfs();
return 0;
}
剪枝的地方:
如果按照下面这个来搜索的话,会成为一个图,就是说,可能会重复入队。点搜一次就可以了,所以按照上面那个来可以减少运行时间