zoukankan      html  css  js  c++  java
  • 洛谷 P2335 [SDOI2005]位图

    OJ检测链接:https://www.luogu.org/problem/show?pid=2335

    题目描述

    现在我们给出一个n*m的单色位图,且该图中至少含有一个白色的像素。我们用(i, j)来代表第i行第j列的像素,并且定义两点p1=(i1, j1)和p2=(i2, j2)之间的距离为:

    d(p1, p2)=|i1 - i2| + |j1 – j2| 任务:

    请写一个程序:

    从文本文件BIT.IN中读入该位图;

    对于每个像素,计算出离该像素最近的白色像素与它的距离;

    把结果输出到文本文件BIT.OUT中。

    输入输出格式

    输入格式:

    在文本文件BIT.IN的第一行包括两个用空格分开的整数n和m,1<=n<=150,1<=m<=150。以下的n行每行包括一个长度为m的整数为零或一,在第i+1行的第j个字符如果为”1”,那么表示像素(i, j)为白的,否则为黑的。

    输出格式: 

    在文本文件BIT.OUT中输出一个n*m的数表,其中的第i行的第j个数字为f(i, j)表示像素(i, j)到最近的白色像素的距离

    输入输出样例

    输入样例#1:
    3 4
    0 0 0 1
    0 0 1 1
    0 1 1 0

    输出样例#1:

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

    分析:

    从每一个白点出发做广搜去计算该白点到其他黑点的最短距离并做更新和记录的操作。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <queue>
     4 
     5 using namespace std;
     6 
     7 int n,m,map[200][200]={0},ans[200][200];
     8 int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}; //上下左右瞎动 
     9 queue<int> p,q;
    10 
    11 void bfs(int x,int y);
    12 
    13 int main()
    14 {
    15     int i,j,k;
    16     scanf("%d%d",&n,&m);
    17     for(i=0;i<160;i++) //初始化ans数组 
    18         for(j=0;j<160;j++)
    19             ans[i][j]=9999;
    20     for(i=1;i<=n;i++)
    21         for(j=1;j<=m;j++)
    22         {
    23             scanf("%d",&map[i][j]); //1为白,0为黑 
    24             if(map[i][j]==1) ans[i][j]=0; //记录白点的距离:0 
    25         }
    26     for(i=1;i<=n;i++) //寻找白格子 
    27         for(j=1;j<=m;j++)
    28             if(map[i][j]==1)
    29             {
    30                 bfs(i,j);
    31             }
    32     for(i=1;i<=n;i++)
    33     {
    34         for(j=1;j<=m;j++)
    35             printf("%d ",ans[i][j]);
    36         printf("
    ");
    37     }
    38     return 0;
    39 }
    40 void bfs(int x,int y)
    41 {
    42     int b[200][200]={0};
    43     int i,tx,ty,txx,tyy;
    44     b[x][y]=1;
    45     p.push(x);
    46     q.push(y);
    47     while(!p.empty())
    48     {
    49         tx=p.front();
    50         ty=q.front();
    51         p.pop();
    52         q.pop();
    53         for(i=0;i<4;i++)
    54         {
    55             txx=tx+dx[i];
    56             tyy=ty+dy[i];
    57             if(txx>0 && txx<=n && tyy>0 && tyy<=m && b[txx][tyy]==0 && map[txx][tyy]!=1&&(ans[tx][ty]+1<ans[txx][tyy])) //越界检查 && 来访检查 && 白格子检查 && 假如本次广搜的路径距离较短才需要把该点入队继续搜索
    58             {
    59                 p.push(txx);
    60                 q.push(tyy);
    61                 b[txx][tyy]=1;
    62                 ans[txx][tyy]=ans[tx][ty]+1;
    63             }
    64         }
    65     }
    66 }
  • 相关阅读:
    EntityFramework 数据库的迁移
    free之后将指针置为NULL
    结构体对齐及#pragma详细解释
    大端小端
    TCP封包解包---如有错误,请纠正!
    堆栈----好久没有更新了
    附近点搜索
    LRU Cache
    电商的秒杀和抢购
    搜索关键词智能提示suggestion
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7631834.html
Copyright © 2011-2022 走看看