文章
20
粉丝
224
获赞
57
访问
138.6k
首先利用广度优先搜索计算出每个困于迷宫中的人移动到迷宫中每个位置需要去掉障碍物的最少数目,最后通过遍历迷宫中的每个位置,得到每个人移动到迷宫中每个位置需要去掉障碍物的数目的和的最小值即可。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f; // 定义无穷大
const int maxn = 100 + 5;
struct node {
int x, y;
};
int n, m;
char mpt[maxn][maxn]; // 存储迷宫结构
int away[maxn][maxn][3]; // 最后一个维度代表困于迷宫中的人数,整个矩阵用于存储每个人到迷宫中每个位置需要去掉的障碍物的数目
int dir[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}}; // 移动的四个方向:向上、向下、向左、向右
node peoples[3]; // 表示困于迷宫中的人
// 使用广度优先搜索求解
void bfs(int index) { // index 表示困于迷宫中的人的编号
queue<node> q; // 使用队列来维护一层层发散的优先级
node now;
now.x = peoples[index].x;
now.y = peoples[index].y;
q.push(now);
away[now.x][now.y][index] = 0;
while (!q.empty()) {
now = q.front();
q.pop();
for (int i = 0; i < 4; ++i) { // 上下左右四个方向
int nx = now.x + dir[i][0];
int ny = now.y + dir[i][1];
// 保证移动后的位置依然位于迷宫内
if (nx >= 1 & nx <= n & ny >= ...
登录后发布评论
7 7
###*w*#
#####*#
#######
######*
######*
######*
W*****f
0 0
我认为这个代码有一些问题,如果输入这个迷宫,计算在(3,6)处汇合,需要移除的墙面数。
最终dist[0][3][6] + dist[1][3][6] + dist[2][3][6] - 2输出的答案为3
但实际上只需要移除两个墙
这是一个错误
好棒的想法