一、题目简述
给定一个只含0和1的矩阵,找到每个1到0的最短距离。
两个相邻单元格的距离是1
例一:
输入:
000010000
输出:
000010000
例二:
输入:
001011001
输出:
001012001
注意:
- 给定矩阵的元素不会超过10000;
- 给定矩阵中至少包含一个0;
- 只有四个方向的单元格之间是邻接的:上、下、左、右。
二、编程思路
本题目中其实质就是求出每个单元格到其最近0之间的最短路径,可以使用广度优先(BFS)搜索进行求解。广度优先搜索一般使用队列实现。
- 首先将矩阵中
matrix
中元素值为零的单元格的坐标入队
q
中,其最短距离矩阵
ans 中相应值设置为0,将元素值为1的单元格的最短距离 ans 设置为-1; - 从队首
q
中取出元素
front ,将其相邻且未被访问过的单元格的最短距离 ans 设为 ans[front]+1 ,并入队。 - 循环,直至队列为空。
三、程序设计
class Solution {
public:
vector<vector<int> > updateMatrix(vector<vector<int> >& matrix) {
vector<vector<int> >ans=matrix;
if(!ans.size() || !ans[0].size()) return ans;
int rows=ans.size(),cols=ans[0].size();
typedef pair<int,int> tp;
queue<tp> q;
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(matrix[i][j]==0){
q.push(tp(i,j));
}
else ans[i][j]=-1;
}
}
tp d[4]={tp(-1,0),tp(1,0),tp(0,1),tp(0,-1)};
while(q.size()){
// cout<<"while"<<endl;
tp front=q.front();
int x=front.first, y=front.second;
q.pop();
for(int i=0;i<4;i++){
int nx=x+d[i].first,ny=y+d[i].second;
// cout<<nx<<" "<<ny<<endl;
if(nx>=0 && nx<rows && ny>=0 && ny<cols && ans[nx][ny]==-1){
ans[nx][ny]=ans[x][y]+1;
q.push(tp(nx,ny));
}
}
}
return ans;
}
};
四、实验心得
广度优先搜索可以用来解决最短路径问题;