給定一個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。
兩個相鄰元素間的距離爲 1 。
示例 1:
輸入:
0 0 0
0 1 0
0 0 0
輸出:
0 0 0
0 1 0
0 0 0
示例 2:
輸入:
0 0 0
0 1 0
1 1 1
輸出:
0 0 0
0 1 0
1 2 1
注意:
- 給定矩陣的元素個數不超過 10000。
- 給定矩陣中至少有一個元素是 0。
- 矩陣中的元素只在四個方向上相鄰: 上、下、左、右。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/01-matrix
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
完整代碼
BFS:求1到0的距離
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
decltype(matrix) res(matrix);
vector<vector<int>> dir = {{-1, 0},{0,-1}, {0,1}, {1, 0}};
for(int i = 0; i < matrix.size(); ++i){
for(int j = 0; j < matrix[0].size(); ++j){
if(matrix[i][j])
BFS(matrix, dir, i, j, res[i][j]);
}
}
return res;
}
private:
void BFS(vector<vector<int>>& matrix, vector<vector<int>>& dir, int i, int j, int &res){
queue<pair<int, int>> q;
q.push(make_pair(i ,j));
while(!q.empty()){
int n = q.size();
while(n--){
auto t = q.front();
q.pop();
for(auto d : dir){
int x = t.first + d[0];
int y = t.second + d[1];
if(x >= 0 && x < matrix.size() && y >= 0 && y < matrix[0].size()){
if(matrix[x][y] == 0)
return;
q.push(make_pair(x, y));
}
}
}
++res;
}
}
};
BFS:求0到1的距離
這裏關鍵的步驟是標記,如果該位置已訪問過,說明已經有0到達該節點,就不用再訪問了。
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
vector<vector<int>> dir = {{-1, 0},{0,-1}, {0,1}, {1, 0}}, res(matrix.size(), vector<int>(matrix[0].size(), 0)), visit(matrix.size(), vector<int>(matrix[0].size(), 0));
queue<pair<int, int>> q;
for(int i = 0; i < matrix.size(); ++i){
for(int j = 0; j < matrix[0].size(); ++j){
if(matrix[i][j] == 0){
q.push(make_pair(i, j));
visit[i][j] = 1;
}
}
}
while(!q.empty()){
auto [x, y] = q.front();
q.pop();
for(auto d : dir){
int tx = x + d[0];
int ty = y + d[1];
if(tx >= 0 && tx < matrix.size() && ty >= 0 && ty < matrix[0].size() && !visit[tx][ty]){
res[tx][ty] = res[x][y] + 1;
visit[tx][ty] = 1;
q.push(make_pair(tx, ty));
}
}
}
return res;
}
};