#295. 「BJWC2010」矩阵距离 题解 2021-09-23 21:42:32

发布时间 2023-05-27 19:44:02作者: zhengxy

image

#295. 「BJWC2010」矩阵距离

又是一道需要真正思考了才可以做出来的水题

题目描述

给出一个N * M 01矩阵, 输出每个0到离这个点最近的1的距离。

思考历程

暴力

由于 $N \le 10^3 $
如果在赛场上出现这个题, 我们优先考虑暴力。 暴力也是很简单,从每个为0的点出发bfs找到与最近的1的距离就可以了。

正解

但是暴力只能拿到36分,由于 $N \le 10^3 $, 所以正解应该是扫一遍的 \(Ο(n * m)\)

这个时间只够我们遍历填一遍表,填一遍表? 我们是否只需要根据 1 的位置,直接填到表里就可以呢?

思考到这里,这道题的正解就出来了。

其中我们只需要填一遍表,不需要进行更新求最小,第一次填到这个点的距离就是答案了。

void bfs() {
	// 应该思考的: 把什么塞到队列里呢?
	while(q.size()) {
		node u = q.front(); q.pop();
		for (int i = 0; i < 4; i++) {
			int x = dx[i] + u.x, y = dy[i] + u.y;
			if (x < 1 || x > n || y < 1 || y > m || ans[x][y] != -1) continue;
			ans[x][y] = ans[u.x][u.y] + 1;
			q.push({x, y});
		}
	}
}