
#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;
}
剪枝的地方:

如果按照下面这个来搜索的话,会成为一个图,就是说,可能会重复入队。点搜一次就可以了,所以按照上面那个来可以减少运行时间

该博客探讨了一种使用宽度优先搜索(BFS)算法来求解二维矩阵中最短路径的问题。代码示例展示了如何初始化并更新距离矩阵,同时通过剪枝策略避免重复搜索,从而提高效率。在主函数中,读取矩阵大小和数据,然后执行BFS以找到起点到终点的最短步数。
2390

被折叠的 条评论
为什么被折叠?



