leetcode 01 矩阵

https://leetcode-cn.com/problems/01-matrix/submissions/数组

给定一个由 0 和 1 组成的矩阵,找出每一个元素到最近的 0 的距离。code

两个相邻元素间的距离为 1 。队列

示例 1: 
输入:leetcode

0 0 0
0 1 0
0 0 0

输出:get

0 0 0
0 1 0
0 0 0

示例 2: 
输入:io

0 0 0
0 1 0
1 1 1

输出:class

0 0 0
0 1 0
1 2 1

注意:date

  1. 给定矩阵的元素个数不超过 10000。
  2. 给定矩阵中至少有一个元素是 0。
  3. 矩阵中的元素只在四个方向上相邻: 上、下、左、右。

有点像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;
    }
    
};