位图

位图

给出一个大小为n行*m列的矩形位图。该位图的每一个象素点不是白色就是黑色,但是至少有一个象素点是白色。在i行j列的象素点我们称为点(i,j)。两个象素点p1=(i1,j1)和p2=(i2,j2)之间的距离定义如下:
d(p1,p2)=|i1-i2|+|j1-j2|.
现在的任务是:对于每一个象素点,计算它到最近的白色点的距离。如果它本身是白色点,距离为0。

输入

第1行:2个整数n,m(1<=n <=182,1<=m<=182)
接下来n行,每一行有一个长度为m的0/1字符串,描述一行象素点。
如果点(i,j)为白色,则值为1,否则值为0。

输出

共n行,每行有m个整数,
数之间用1个空格分开,分别表示对应的象素点距离白色点的距离。

样例输入

3 4
0001
0011
0110

样例输出

3 2 1 0
2 1 0 0

Code

#include<cstdio> 
#define MAX_MN 200 
bool R[MAX_MN][MAX_MN]; 
int G[MAX_MN][MAX_MN]; 
int Dr[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //四个方向
int n,m;    
int head=1,tail=1; //队头队尾
struct NODE{ 
    int x,y; 
}Q[MAX_MN*MAX_MN+5]; //数组模拟队列
void Bfs(){ 
    while(head<tail){ 
        for(int i=0;i<4;i++){ 
            int xx=Q[head].x+Dr[i][0]; 
            int yy=Q[head].y+Dr[i][1]; 
            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&//未出界
            G[xx][yy]>G[Q[head].x][Q[head].y]+1){//值大于最小情况的值
                Q[tail].x=xx;
                Q[tail++].y=yy; 
                G[xx][yy]=G[Q[head].x][Q[head].y]+1; //更新值
            }
        } 
        head++; //继续拓展
    } 
} 
int main(){ 
    scanf("%d%d",&n,&m); 
    for(int i=1;i<=n;i++){ 
        char Y[MAX_MN]; 
        scanf("%s",Y+1); 
        for(int j=1;j<=m;j++){ 
            R[i][j]=Y[j]-'0'; 
            if(R[i][j]){//加入队列
                Q[tail].x=i; 
                Q[tail++].y=j; 
            } 
            else G[i][j]=99999999;//赋极大值 
        } 
    } 
    Bfs(); //广度优先搜索
    for(int i=1;i<=n;i++){ 
        for(int j=1;j<m;j++) 
            printf("%d ",G[i][j]); 
        printf("%d\n",G[i][m]); 
    } 
} 

猜你喜欢

转载自blog.csdn.net/qq_38956769/article/details/79677568