用广度优先搜索(已标记注释,自行理解)
2026-08-26 23:22:01
发布于:广东
5阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,s,b,a[410][410]{};
ll dx[]{-2,-2,-1,1,2,2,1,-1};
ll dy[]{-1,1,2,2,1,-1,-2,-2};
/*
这是一个广度优先搜索(BFS)算法的实现,用于计算从起点(s,b)到网格中所有其他位置的最短距离。
网格大小为n×m,使用队列来实现BFS遍历。
*/
int main(){
// 输入网格的行数n、列数m,以及起点坐标(s,b)
cin >> n >> m >> s >> b;
// 定义一个队列,用于BFS遍历,队列中存储的是坐标对(x,y)
queue<pair<ll,ll>> q;
// 将起点坐标加入队列,并标记为已访问
q.push({s,b});
a[s][b] = 1;
// 当队列不为空时,继续进行BFS遍历
while(!q.empty()){
// 取出队首元素,获取当前坐标
auto t = q.front();
ll x = t.first;
ll y = t.second;
// 弹出队首元素
q.pop();
// 遍历8个可能的移动方向
for(ll i=0;i<8;i++){
// 计算新的坐标
ll xx = x + dx[i];
ll yy = y + dy[i];
// 检查新坐标是否在网格范围内,且未被访问过
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!a[xx][yy]){
// 更新新位置的访问距离,并将其加入队列
a[xx][yy] = a[x][y] + 1;
q.push({xx,yy});
}
}
}
// 输出每个位置到起点的最短距离(减去1是因为起点距离记为1)
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
cout << a[i][j]-1 << " ";
}
cout << '\n';
}
return 0;
}
这里空空如也







有帮助,赞一个