01 矩阵(广搜leetcode542)-------------------c++实现

01 矩阵(广搜leetcode542)-------------------c++实现

题目表述

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

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

样例

输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

条件

m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
mat[i][j] is either 0 or 1.
mat 中至少有一个 0

思路

1.暴力从1扩展,广搜搜索可行距离,超时。
2.从0开始扩展广搜。

代码
没过的代码:

思路:从每一个点扩展搜索长度。

#include <iostream>
#include <string>
#include <vector>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
    int juedui(int x,int y)
    {
        (x>y)?return x-y:return x-y;
    }
    vector<vector<int> > updateMatrix(vector<vector<int> >& mat) {
       int line = mat[0].size();
       int row = mat.size();
       int x1[4]={-1,0,1,0};
       int y1[4]={0,-1,0,1};//上左下右
       int visit[row][line];
       vector<vector<int> > need(row,vector<int>(line));
       queue<int> q;
       int l=0,r=0;
       int sit=0;
       for(int i=0;i<row;i++)
        for(int j=0;j<line;j++)
        {
            if(!mat[i][j])
                need[i][j]=0;//该位置是0直接赋0
            else{      //该位置不是0
                 memset(visit,0,sizeof(visit));
                 visit[i][j]++;
                 q.push(i*line+j);
            while(!q.empty()){        //找最短路径

                    sit=q.front();
                    cout<<"sit:            "<<sit<<endl;
                    q.pop();
                    for(int i1=0;i1<4;i1++)
                {
                    r=sit/line+x1[i1];
                    l=sit%line+y1[i1];
                    if(r>=0&&l>=0&&r<row&&l<line){
                    if(!mat[r][l])
                        {
                            while(!q.empty())
                              q.pop();
                            break;
                            }
                    else if(visit[r][l]==0){
                        visit[r][l]++;
                         q.push(r*line+l);
                    }
                    }
                }
            }
            need[i][j]=juedui(r,i)+juedui(l,j);
            cout<<"结果r,l   "<<r<<"  "<<l<<endl;
            }
        }
        return need;
        }
};
void show(vector<vector<int> > x){
    for(int i=0;i<x.size();i++)
    {
        for(int j=0;j<x[0].size();j++)
        cout<<x[i][j]<<" ";
    cout<<endl;
    }
    return;
}
int main()
{
    vector<vector<int> > a(10,vector<int>(10));
     int b[10][10]={{1,0,1,1,0,0,1,0,0,1},{0,1,1,0,1,0,1,0,1,1},{0,0,1,0,1,0,0,1,0,0},{1,0,1,0,1,1,1,1,1,1},{0,1,0,1,1,0,0,0,0,1},{0,0,1,0,1,1,1,0,1,0},{0,1,0,1,0,1,0,0,1,1},{1,0,0,0,1,1,1,1,0,1},{1,1,1,1,1,1,1,0,1,0},{1,1,1,1,0,1,0,0,1,1}};

 for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
         a[i][j]=b[i][j];
    Solution s;
    show(a);
    a=s.updateMatrix(a);
    show(a);

    return 0;
}
通过代码:
class Solution {
public:

    vector<vector<int> > updateMatrix(vector<vector<int> >& mat){
       int line = mat[0].size();
       int row = mat.size();
       int x1[4]={-1,0,1,0};
       int y1[4]={0,-1,0,1};//上左下右
       int visit[row][line];
       memset(visit,0,sizeof(visit));
       int change;
       int x2,y2;
       queue<int>  q;
       vector<vector<int> > need(row,vector<int>(line));
       int l=0,r=0;
       for(int i=0;i<row;i++)
        for(int j=0;j<line;j++)
       {
           if(mat[i][j]==0)
            {
            q.push(i*line+j);
           visit[i][j]++;
            }
       }
       while(!q.empty()){
        change=q.front();
        q.pop();
        x2=change/line;
        y2=change%line;
        for(int i1=0;i1<4;i1++)
        {

            r=x2+x1[i1];
            l=y2+y1[i1];
            if(l>=0&&l<line&&r>=0&&r<row)
               if(visit[r][l]==0){
                need[r][l]=need[x2][y2]+1;
                q.push(r*line+l);
                visit[r][l]++;
               }
        }
       }
        return need;
        }

};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值