https://leetcode-cn.com/problems/01-matrix/submissions/
给定一个由 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。
- 矩阵中的元素只在四个方向上相邻: 上、下、左、右。
有点像BFS和Dijkstra
class Solution {
public:
struct Point
{
int row;
int col;
Point(int a,int b){
row=a;col=b;
}
};
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix)
{
vector<vector<int>> G;
queue<Point> Q;
//先遍历一遍二维数组,建新的二维数组,其中0仍为0,1则改为INT_MAX,表示距离0的最短距离(此时未知)
//同时将值为0的坐标点push进队列中,
for(int i=0;i<matrix.size();i++)
{
vector<int> gtem;
for(int j=0;j<matrix[i].size();j++)
{
if(matrix[i][j]==0){//自己就是0,那么到0的距离就是0了
gtem.push_back(0);
Q.push(Point(i,j));
}
else{
gtem.push_back(INT_MAX);
}
}
G.push_back(gtem);
}
//对每个已知与0最短距离的点(暂时),看他周围的四个点,是否能减短他们到0的距离,能则修改,并且将其坐标点push进Q中
while(!Q.empty())
{
Point p=Q.front();
Q.pop();
if(p.row-1>=0&&G[p.row-1][p.col]>G[p.row][p.col]+1){
G[p.row-1][p.col]=G[p.row][p.col]+1;
Q.push(Point(p.row-1,p.col));
}
if(p.row+1<matrix.size()&&G[p.row+1][p.col]>G[p.row][p.col]+1){
G[p.row+1][p.col]=G[p.row][p.col]+1;
Q.push(Point(p.row+1,p.col));
}
if(p.col-1>=0&&G[p.row][p.col-1]>G[p.row][p.col]+1){
G[p.row][p.col-1]=G[p.row][p.col]+1;
Q.push(Point(p.row,p.col-1));
}
if(p.col+1<matrix[0].size()&&G[p.row][p.col+1]>G[p.row][p.col]+1){
G[p.row][p.col+1]=G[p.row][p.col]+1;
Q.push(Point(p.row,p.col+1));
}
}
return G;
}
};