广度优先搜索(看注释,自行理解)
2026-08-26 23:22:23
发布于:广东
4阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,dis[110][110]{};
ll dx[]{-1,1,0,0};
ll dy[]{0,0,1,-1};
char a[110][110]{};
queue<pair<ll,ll>> q;
/*
* 主函数:实现广度优先搜索(BFS)算法求解最短路径
* 从起点'S'到终点'T'的最短距离
*/
int main(){
// 读取输入的行列数n和m
cin >> n >> m;
// 双重循环遍历整个地图
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
// 读取地图每个位置的值
cin >> a[i][j];
// 如果当前位置是起点'S',将其加入队列
if(a[i][j]=='S'){
q.push({i,j});
}
}
}
// 当队列不为空时,继续搜索
while(!q.empty()){
// 取出队首元素
auto t = q.front();
q.pop();
// 获取当前点的坐标
ll x = t.first,y = t.second;
// 如果当前点是终点'T',输出距离并结束程序
if(a[x][y]=='T'){
cout << dis[x][y];
return 0;
}
// 遍历四个方向(上、右、下、左)
for(ll i=0;i<=3;i++){
// 计算新位置的坐标
ll xx = x+dx[i],yy = y+dy[i];
// 检查新位置是否在地图范围内,不是障碍物,且未被访问过
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!='#'&&!dis[xx][yy]){
// 将新位置加入队列
q.push({xx,yy});
// 更新新位置的距离
dis[xx][yy] = dis[x][y]+1;
}
}
}
// 如果队列为空仍未找到终点,输出-1
cout << -1;
return 0;
}
这里空空如也







有帮助,赞一个