题意
【题意】
给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为:
dist(A[i][j],A[k][l])=|i−k|+|j−l|
输出一个N行M列的整数矩阵B,其中:
B[i][j]=min1≤x≤N,1≤y≤M,A[x][y]=dist(A[i][j],A[x][y])
【输入格式】
第一行两个整数n,m。
接下来一个N行M列的01矩阵,数字之间没有空格。
【输出格式】
一个N行M列的矩阵B,相邻两个整数之间用一个空格隔开。
【数据范围】
1≤N,M≤1000
【输入样例】
3 4
0001
0011
0110
【输出样例】
3 2 1 0
2 1 0 0
1 0 0 1
题解
SB题吗。
对于每个1都踢入队列,然后乱找,不就行了?
#include<cstdio>
#include<cstring>
#define N 1100
#define NN 1100000
using namespace std;
struct node
{
int x,y;
}list[NN];int head,tail;
int dis[N][N],a[N][N];/*定义为B数组+1*/
int n,m;
char st[N];
int dx[]={0,-1,0,1};
int dy[]={-1,0,1,0};
int main()
{
head=1;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",st+1);
for(int j=1;j<=m;j++)
{
a[i][j]=(st[j]=='1');
if(a[i][j]==1)
{
dis[i][j]=1;
list[++tail].x=i;list[tail].y=j;
}
}
}
while(head<=tail)
{
node pre=list[head++];
for(int i=0;i<=3;i++)
{
node now;
now.x=pre.x+dx[i];now.y=pre.y+dy[i];
if(1<=now.x && now.x<=n && now.y>=1 && now.y<=m && !dis[now.x][now.y])
{
dis[now.x][now.y]=dis[pre.x][pre.y]+1;
list[++tail]=now;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)printf("%d ",dis[i][j]-1);
printf("%d\n",dis[i][m]-1);
}
return 0;
}