# #295. 「BJWC2010」矩阵距离
又是一道需要真正思考了才可以做出来的~~水题~~。
## 题目描述
给出一个`N * M `的`01`矩阵, 输出每个`0`到离这个点最近的`1`的距离。
## 思考历程
### 暴力
由于 $N \le 10^3 $
如果在赛场上出现这个题, 我们优先考虑暴力。 暴力也是很简单,从每个为`0`的点出发`bfs`找到与最近的`1`的距离就可以了。
### 正解
但是暴力只能拿到`36`分,由于 $N \le 10^3 $, 所以正解应该是扫一遍的 $Ο(n * m)$
这个时间只够我们遍历填一遍表,填一遍表? 我们是否只需要根据 `1` 的位置,直接填到表里就可以呢?
思考到这里,这道题的正解就出来了。
其中我们只需要填一遍表,不需要进行更新求最小,第一次填到这个点的距离就是答案了。
```cpp
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});
}
}
}
```