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

分析:

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

 #include <cstdio>
#include <iostream>
#include <queue> using namespace std; int n,m,map[][]={},ans[][];
int dx[]={-,,,},dy[]={,,-,}; //上下左右瞎动
queue<int> p,q; void bfs(int x,int y); int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for(i=;i<;i++) //初始化ans数组
for(j=;j<;j++)
ans[i][j]=;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
scanf("%d",&map[i][j]); //1为白,0为黑
if(map[i][j]==) ans[i][j]=; //记录白点的距离:0
}
for(i=;i<=n;i++) //寻找白格子
for(j=;j<=m;j++)
if(map[i][j]==)
{
bfs(i,j);
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
printf("%d ",ans[i][j]);
printf("\n");
}
return ;
}
void bfs(int x,int y)
{
int b[][]={};
int i,tx,ty,txx,tyy;
b[x][y]=;
p.push(x);
q.push(y);
while(!p.empty())
{
tx=p.front();
ty=q.front();
p.pop();
q.pop();
for(i=;i<;i++)
{
txx=tx+dx[i];
tyy=ty+dy[i];
if(txx> && txx<=n && tyy> && tyy<=m && b[txx][tyy]== && map[txx][tyy]!=&&(ans[tx][ty]+<ans[txx][tyy])) //越界检查 && 来访检查 && 白格子检查 && 假如本次广搜的路径距离较短才需要把该点入队继续搜索
{
p.push(txx);
q.push(tyy);
b[txx][tyy]=;
ans[txx][tyy]=ans[tx][ty]+;
}
}
}
}

洛谷 P2335 [SDOI2005]位图的更多相关文章

  1. 洛谷 - P2335 - 位图 - 简单dp

    https://www.luogu.org/problemnew/show/P2335 假如我们使用dp的话,每次求出一个点的左上方.右上方.左下方.右下方的最近的白点的距离.那么只是n²的复杂度.这 ...

  2. 洛谷 P2335 SDOI 2005 毒瘤 位图(也补上注释了)

    #include<iostream> #include<cstdio> #include<queue> #include<cstring> using ...

  3. 洛谷——P2434 [SDOI2005]区间

    P2434 [SDOI2005]区间 题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间 ...

  4. 洛谷 P1463 [SDOI2005]反素数ant

    P1463 [SDOI2005]反素数ant 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i< ...

  5. 洛谷P2434 [SDOI2005]区间

    题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...

  6. 洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)

    题目背景 我们现有许多演讲要在阶梯教室中举行.每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的.现在我们想要尽最大可能的利用这个教室 ...

  7. 洛谷 P1463 [SDOI2005]反素数ant && codevs2912反素数

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  8. 洛谷 2449 [SDOI2005]矩形

    [题解] 因为这道题中n比较小,n^2效率是可以接受的. 枚举两个矩形,如果它们有重叠部分,就用并查集合并一下即可. #include<cstdio> #include<algori ...

  9. 洛谷 2434 [SDOI2005]区间

    [题解] 鲜活的大水题... 把区间排个序然后瞎搞就可以了,发现现在区间的左端点比之前区间的最大的右端点还大,那就增加一个答案区间.每次更新目前最大右区间. #include<cstdio> ...

随机推荐

  1. Android图片载入框架最全解析(一),Glide的基本使用方法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53759439 本文同步发表于我的微信公众号.扫一扫文章底部的二维码或在微信搜索 郭 ...

  2. iOS:仿写探探App动画

    一.简单介绍 探探动画比较新颖,这也是它在众多交友软件中火热的一个特色.实现这种动画的方式可以有两种方式实现: 1.使用转场动画实现  2.使用CollectionView自定义布局实现, 此处我提供 ...

  3. 为sharepoint的内部页面添加后台代码

    我们知道,存储在数据库里的SharePoint页面是不能直接添加后台代码的,这给我们带来了很多的不方便,比如想要在页面上实现一些东西,都必 须使用Webpart或者自定义控件的方式,哪怕仅仅是很简单的 ...

  4. 如何在Vblock里配置Boot from SAN

    啥是vBlock ============ vBlock是VCE用在包含了它的数据中心产品的组件的机架上的一个商标名. 机架中的组件都是有VCE出厂前预先组装好的, 组件的预设以及解决方案, 都是客户 ...

  5. ASP.NET 网站管理工具介绍

    有没有感觉对 web.config 的操作很烦呢? 老是手动来编辑 web.config 确实挺麻烦的, 不过自 ASP.NET 2.0 起便有了 ASP.NET 网站管理工具, 这个工具呢,其实就是 ...

  6. ORM数据库框架 LitePal SQLite MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. android 数据加密——加密的概述

    数据加密又称密码学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法.它利 ...

  8. Java通信过程的中文乱码的解决

    J在基于Java的编程中,常常会碰到汉字的处里及显示的问题.比方一大堆乱码或问号. 这是由于JAVA中默认的编码方式是UNICODE.而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码 ...

  9. 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点

    转自:http://www.jb51.net/article/100111.htm 首先我们需要安装好Nginx.jdk.Tomcat,安装方法已经在 上一篇 说过了,本篇不再赘述. 下来看一下我们的 ...

  10. LintCode: Number of Airplanes in the Sky

    C++ (1)把interval数组中的所有start和所有end放在同一个数组中,然后进行排序,遇到start就起飞一架飞机,遇到一架end就降落一架飞机,所以start有个+1属性,end有个-1 ...