文章

20

粉丝

224

获赞

56

访问

137.3k

头像
广度优先搜索计算每个人移动到每个位置需要去掉障碍物的最少数目,最后求和的最小值
P1308
发布于2022年2月14日 16:58
阅读数 10.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 >= ...
登录查看完整内容


登录后发布评论

3 条评论
Howie_Waves
2024年9月3日 00:23

7 7
###*w*#
#####*#
#######
######*
######*
######*
W*****f
0 0
我认为这个代码有一些问题,如果输入这个迷宫,计算在(3,6)处汇合,需要移除的墙面数。
最终dist[0][3][6] + dist[1][3][6] + dist[2][3][6] - 2输出的答案为3
但实际上只需要移除两个墙
这是一个错误

赞(0)

Howie_Waves : 回复 Howie_Waves: 把dist换成away,我们的命名不一样

2024年9月3日 00:24
ottata
2024年6月29日 22:02

好棒的想法

赞(0)