题目描述
第一行两个整数n,m。
接下来一个N行M列的01矩阵,数字之间没有空格
输出
一个N行M列的矩阵B,相邻两个整数之间用一个空格隔开。
样例输入
3 4
0001
0011
0110
样例输出
3 2 1 0
2 1 0 0
1 0 0 1
**队列为先进先出**
**n*n矩阵输入只有0和1,输出一个n*n矩阵,每个元素为'1'点到该点的最少步数**
#include<bits/stdc++.h>
using namespace std;
char a[2000][2000];
//**定义标记数组**
int v[2000][2000];
queue<node> r;
int main()
{
int n,m,d;
int p=0,q=0;
//**用数组定义上下左右四个方向的走法,用二维数组同理**
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
cin>>a[i];
}
//**将标记数组都标记为未走过**
memset(v,-1,sizeof v);
while(!r.empty())r.pop();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
//**将起始点标记为走过并且弹入队列**
if(a[i][j]=='1')
{
v[i][j]=0;
r.push({i,j});
}
}
}
while(!r.empty())
{
//**把原始点弹出队列**
node temp=r.front();r.pop();
for(int i=0;i<4;i++)
{
int tx=temp.x+dx[i];
int ty=temp.y+dy[i];
if(tx<0||tx>=n||ty<0||ty>=m)continue;
if(v[tx][ty]==-1)
{
v[tx][ty]=v[temp.x][temp.y]+1;
//**走一个点把该点弹入队列**
r.push({tx,ty});
}
}
}
for(int i=0;i<n;i++)
{
for(int d=0;d<m;d++)
{
printf("%d ",v[i][d]);
}printf("\n");
}
return 0;
}