#295. 「BJWC2010」矩阵距离 题解 2021-09-23 21:42:32
#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});
}
}
}