问题描述:
给定一个由 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
执行结果:
代码描述:
找邻域,确定与0的距离。
第一次循环,遍历所有点,如果当前点为0,跳过;否则,找其邻域4个点是否有0,如果有,跳过;如果没有,将该点的值+1;
第二次循环,如果当前点小于等于1,跳过;否则,找其邻域4个点是否有1,如果有,跳过;如果没有,将该点的值+1;
......依次类推。在循环中,对跳过点计数,如果所有点都被跳过,则说明已完成,结束。
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int row = matrix.size(); // 行
int col = matrix[0].size(); // 列
int base = 0;
int count = 0; // 记录扫描过的点
while(count != row*col) // 扫描完所有点,退出循环
{
count = 0;
for(int i = 0; i < row; ++i) // 行
{
for(int j = 0; j < col; ++j) // 列
{
if(matrix[i][j] <= base)
{
count ++;
continue;
}
bool ava = false;
// left
if(j - 1 >= 0)
{
if(matrix[i][j-1] == base)
ava = true;
}
// right
if(j + 1 < col)
{
if(matrix[i][j+1] == base)
ava = true;
}
//top
if(i-1 >= 0)
{
if(matrix[i-1][j] == base)
ava = true;
}
// buttom
if(i + 1 < row)
{
if(matrix[i+1][j] == base)
ava = true;
}
if(!ava)
matrix[i][j]++;
else
count++;
}
}
base++;
}
return matrix;
}
};