• 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("
    ");
                }
                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("
    ");
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    002. 在HTML页面嵌入循环代码
    001. 为input type=text 时设置默认值
    PHP包名解释
    003. vs2010发布、打包安装程序(转)
    SQL server 2008 Express Edition实现自动备份和自动删除备份
    解决phpMyAdmin中缺少mysqli扩展的错误
    IIS6下PHP环境的资源未找到(404)问题
    解决远程桌面连接过去后是蓝色屏幕问题
    解决tomcat一闪而过问题
    解决访问远程共享时发生 请检查名称的拼写. 否则, 网络可能有问题 故障
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7738652.html
Copyright © 2020-2023  润新知