本题的题意是给定一个元素个数不超过10000的01矩阵,而且其中至少有一个0,求该矩阵中所有元素距离其最近的0的距离。其中,每个元素与其上下左右的元素之间的距离为1。
我采用BFS的思想解决此题。首先将矩阵matrix中所有等于0的坐标加入到队列中,所有等于1的元素置为一个不可能达到的距离最大值(这里取100000),意为当前所有的0都是最短距离(距离是0),所有的1到0的距离是无穷大的。然后不断地从队列中移除首元素,并将首元素坐标的四周可以更新为更短距离的坐标更新为当前的最短距离,并将该坐标加入队列尾部,直到队列为空,最后返回更新完的matrix就可以了。
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
queue<pair<int, int>> bfs;
for (int i = 0; i < matrix.size(); ++i) {
for (int j = 0; j < matrix[i].size(); ++j) {
if (matrix[i][j] == 0) {
pair<int, int> cord_0(i, j);
bfs.push(cord_0);
} else {
matrix[i][j] = 100000;
}
}
}
while (!bfs.empty()) {
pair<int, int> curr_ = bfs.front();
bfs.pop();
if (curr_.first - 1 >= 0 && matrix[curr_.first - 1][curr_.second] > matrix[curr_.first][curr_.second] + 1) {
matrix[curr_.first - 1][curr_.second] = matrix[curr_.first][curr_.second] + 1;
pair<int, int> cord_(curr_.first - 1, curr_.second);
bfs.push(cord_);
}
if (curr_.second - 1 >= 0 && matrix[curr_.first][curr_.second - 1] > matrix[curr_.first][curr_.second] + 1) {
matrix[curr_.first][curr_.second - 1] = matrix[curr_.first][curr_.second] + 1;
pair<int, int> cord_(curr_.first, curr_.second - 1);
bfs.push(cord_);
}
if (curr_.second + 1 < matrix[0].size() && matrix[curr_.first][curr_.second + 1] > matrix[curr_.first][curr_.second] + 1) {
matrix[curr_.first][curr_.second + 1] = matrix[curr_.first][curr_.second] + 1;
pair<int, int> cord_(curr_.first, curr_.second + 1);
bfs.push(cord_);
}
if (curr_.first + 1 < matrix.size() && matrix[curr_.first + 1][curr_.second] > matrix[curr_.first][curr_.second] + 1) {
matrix[curr_.first + 1][curr_.second] = matrix[curr_.first][curr_.second] + 1;
pair<int, int> cord_(curr_.first + 1, curr_.second);
bfs.push(cord_);
}
}
return matrix;
}
};