cogs 32. [POI1999] 位图

32. [POI1999] 位图

★   输入文件:bit.in   输出文件:bit.out   简单对比
时间限制:1 s   内存限制:128 MB

【问题描述 】

给定一个 n*m 的矩形位图,位图中的每个像素不是白色就是黑色,但至少有一个是白色的。第 i 行、第 j 列的像素被称作像素 (i, j) 。两个像素 p1 = (i1, j1) , p2 = (i2, j2) 之间的距离定义为: d(p1, p2) = |i1 - i2| + |j1 - j2|.

【任务 】

编一个程序完成以下操作:

1 .从输入文件中读入此位图的有关信息。

2 .对于每个像素,计算此像素与离其最近的“白像素”的距离。

3 .将结果写到输出文件里面。

【输入格式 】

输入文件的第一行包含两个整数 n, m ( 1 ≤ n ≤ 182, 1 ≤ m ≤ 182 ),用一个空格隔开。接下来 n 行,每一行都包含一个长度为 m 的 01 串;第 i+1 行,第 j 列的字符若为 1 ,则像素 (i, j) 是白色的;否则是黑色的。

【输出格式 】

输出文件包含 n 行 , 每行有 m 个用空格隔开的整数。第 i 行、第 j 列的整数表示 (i, j) 与离它最近的白像素之间的距离

【样例输入】

bit.in

3 4 
0001 
0011 
0110

【样例输出】

bit.out

3 2 1 0 
2 1 0 0 
1 0 0 1

思路:宽搜可过。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int a[200][200];
int dx[5]={0,1,0,-1};
int dy[5]={1,0,-1,0};
queue<int>que,pue;
void bfs(){
    while(!que.empty()){
        int x=que.front(),y=pue.front();
        que.pop();
        pue.pop();
        for(int i=0;i<4;i++){
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!=0 ){
                if(a[xx][yy]==-1){
                    a[xx][yy]=a[x][y]+1;
                    que.push(xx);
                    pue.push(yy);
                }
                else{
                    if(a[xx][yy]>a[x][y]+1){
                        a[xx][yy]=a[x][y]+1;
                        que.push(xx);
                        pue.push(yy);
                    }
                }
            }
            /*cout<<"******************************"<<endl;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++)
                    printf("%d ",a[i][j]);
                printf("\n");
            }
            cout<<"*******************************"<<endl;*/
        }
    }
}
int main(){
    freopen("bit.in","r",stdin);
    freopen("bit.out","w",stdout);
    scanf("%d%d",&n,&m);
    memset(a,-1,sizeof(a));
    for(int i=1;i<=n;i++){
        char s[200];
        scanf("%s",s+1);
        for(int j=1;j<=m;j++){
            if(s[j]=='1'){
                a[i][j]=0;
                que.push(i);
                pue.push(j);
            }
        }
    }
    bfs();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
}

 

posted @ 2017-10-26 19:22  一蓑烟雨任生平  阅读(169)  评论(0编辑  收藏  举报