542. 01 Matrix
题目描述:
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1. Example 1:
Input:
0 0 0 0 1 0 0 0 0Output:
0 0 0 0 1 0 0 0 0
Example 2:
Input:
0 0 0 0 1 0 1 1 1Output:
0 0 0 0 1 0 1 2 1
Note:
- The number of elements of the given matrix will not exceed 10,000.
- There are at least one 0 in the given matrix.
- The cells are adjacent in only four directions: up, down, left and right.
题目链接:542. 01 Matrix
算法描述:
由题意知,给出一个 0 - 1 矩阵,我们将找到每个 1 与 0 的最短距离,返回一个结果矩阵。
我们采用广度优先遍历 BFS 。构建一个队列 q ,对矩阵进行顺序遍历,如果发现 0 ,将其位置坐标放入队列中,否则,将其置为 -1(默认数) 。
之后,我们从队列当中依次取出头元素,第一次取出时,它们表示矩阵中的 0 ,我们再利用 dis 数组可以求出它们的上下左右四个相邻元素的位置坐标,当这四个上下左右元素的位置满足条件(位置在矩阵内部,并且对应的值为 -1 ),我们对其赋值(表示距离它相邻的 0 元素位置加一),之后再将其放入队列中。这样,按照广度优先遍历的方法依次访问和更新矩阵中的值,直到队列中元素为空。
返回结果矩阵。
代码:
class Solution {
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
vector<vector<int>> ansMatrix = matrix;
typedef pair<int,int> t;
queue<t> q;
t dis[4] = { t(-1,0), t(1,0), t(0,1) ,t(0,-1) };
if(matrix.size() == 0 || matrix[0].size() == 0){
return ansMatrix;
}
for (int i=0; i<matrix.size(); i++){
for(int j=0; j<matrix[0].size(); j++){
if(matrix[i][j]==0){
q.push(t(i,j));
}
else{
ansMatrix[i][j]=-1;
}
}
}
while(q.size() != 0){
t temp = q.front();
int x = temp.first;
int y = temp.second;
q.pop();
for(int i=0; i<4; i++){
int nx = x+dis[i].first;
int ny = y+dis[i].second;
if(nx>=0 && nx<matrix.size() && ny>=0 && ny<matrix[0].size() && ansMatrix[nx][ny] ==-1){
ansMatrix[nx][ny] = ansMatrix[x][y]+1;
q.push(t(nx,ny));
}
}
}
return ansMatrix;
}
};