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