題目描述
給定一個由 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
注意:
給定矩陣的元素個數(shù)不超過 10000。
給定矩陣中至少有一個元素是 0史翘。
矩陣中的元素只在四個方向上相鄰: 上枉长、下、左琼讽、右必峰。
分析
采用BFS算法
第一步,遍歷矩陣跨琳,所有的0值都可能是起點自点,保存到隊列,非0值設(shè)置成INT_MAX
第二步脉让,遍歷隊列桂敛,取隊列頭的點,x, y溅潜。判斷上术唬、下、左滚澜、右的點粗仓,如果大于matrix[x][y] + 1,則更新這些點的數(shù)值,并把更新后的點放進隊列里面设捐,因為這些點更新了借浊,這些點周圍的點也可能需要更新
代碼
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int row = matrix.size();
int col = matrix[0].size();
queue<pair<int,int>> q;
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
if(matrix[i][j] == 0) {
q.push(make_pair(i, j));
} else {
matrix[i][j] = INT_MAX;
}
}
}
while(!q.empty()){
auto p = q.front();
int x = p.first;
int y = p.second;
q.pop();
int cur = matrix[x][y] + 1;
if(x > 0 && matrix[x - 1][y] > cur) {
matrix[x-1][y] = cur;
q.push(make_pair(x - 1, y));
}
if(x < row - 1 && matrix[x + 1][y] > cur) {
matrix[x + 1][y] = cur;
q.push(make_pair(x + 1, y));
}
if(y > 0 && matrix[x][y - 1] > cur) {
matrix[x][y - 1] = cur;
q.push(make_pair(x, y - 1));
}
if(y < col - 1 && matrix[x][y + 1] > cur) {
matrix[x][y + 1] = cur;
q.push(make_pair(x, y + 1));
}
}
return matrix;
}
};