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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。