【正经题解】营救计划
2024-03-18 13:42:48
发布于:浙江
15阅读
0回复
0点赞
读入迷宫的地图,使用二维数组 表示,其中 表示可以通过的位置, 表示障碍物或已访问过的位置, 表示守卫的位置。
使用优先队列 _ 进行广度优先搜索,队列中的元素是节点 ,包含当前位置 ( , ) 和到达当 前位置所需的时间 。
从起始位置开始,依次按照上、右、下、左四个方向进行搜索。如果新位置是可以通过的位置,就将该新位置加入队列,并将该位置标记为已访问。
搜索过程中,如果到达终点位置 ( , ),则输出当前时间 ,表示最少需要花费的时间。
如果队列为空而没有到达终点位置,则输出 ' ,表示无法救出被困者。
#include<bits/stdc++.h>
using namespace std;
int n, m, sx, sy, ex, ey;
int a[205][205]; // 二维数组表示迷宫地图
int fx[] = {1, 0, -1, 0}; // 上、右、下、左四个方向的偏移
int fy[] = {0, 1, 0, -1};
struct Node {
int x, y, d; // 节点的位置 (x, y) 和到达该节点的时间 d
friend bool operator<(Node a, Node b) {
return a.d > b.d; // 优先队列按照时间 d 从小到大排序
}
};
int main() {
cin >> n >> m;
char c;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> c;
if (c != '#') {
a[i][j] = 1;
if (c == 'M') sx = i, sy = j; // 记录起始位置
if (c == '@') ex = i, ey = j; // 记录终点位置
if (c == 'G') a[i][j] = 2; // 标记守卫的位置
}
}
}
priority_queue<Node> q;
q.push({sx, sy, 0}); // 将起始位置加入队列
while (q.size()) {
Node t = q.top();
q.pop();
if (t.x == ex && t.y == ey) {
cout << t.d; // 如果当前位置为终点位置,输出最少花费的时间
return 0;
}
for (int i = 0; i < 4; i++) {
int nx = t.x + fx[i];
int ny = t.y + fy[i];
if (a[nx][ny]) {
q.push({nx, ny, t.d + a[nx][ny]}); // 将新位置加入队列,并更新到达新位置所需的时间
a[nx][ny] = 0; // 将新位置标记为已访问
}
}
}
cout << "You can't save Mengxin"; // 队列为空但未到达终点,输出无法救出被困者
return 0;
}
这里空空如也
有帮助,赞一个