542. 01 Matrix

一、题目简述

给定一个只含0和1的矩阵,找到每个1到0的最短距离。
两个相邻单元格的距离是1
例一:
输入:
000010000
输出:
000010000
例二:
输入:
001011001
输出:
001012001
注意:

  1. 给定矩阵的元素不会超过10000;
  2. 给定矩阵中至少包含一个0;
  3. 只有四个方向的单元格之间是邻接的:上、下、左、右。

二、编程思路

本题目中其实质就是求出每个单元格到其最近0之间的最短路径,可以使用广度优先(BFS)搜索进行求解。广度优先搜索一般使用队列实现。

  1. 首先将矩阵中 matrix 中元素值为零的单元格的坐标入队 q 中,其最短距离矩阵ans中相应值设置为0,将元素值为1的单元格的最短距离 ans 设置为-1;
  2. 从队首 q 中取出元素front,将其相邻且未被访问过的单元格的最短距离 ans 设为 ans[front]+1 ,并入队。
  3. 循环,直至队列为空。

三、程序设计

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;
    }
};

四、实验心得

广度优先搜索可以用来解决最短路径问题;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值