洛谷 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)到最近的白色像素的距离
输入输出样例
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]位图的更多相关文章
- 洛谷 - P2335 - 位图 - 简单dp
https://www.luogu.org/problemnew/show/P2335 假如我们使用dp的话,每次求出一个点的左上方.右上方.左下方.右下方的最近的白点的距离.那么只是n²的复杂度.这 ...
- 洛谷 P2335 SDOI 2005 毒瘤 位图(也补上注释了)
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using ...
- 洛谷——P2434 [SDOI2005]区间
P2434 [SDOI2005]区间 题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间 ...
- 洛谷 P1463 [SDOI2005]反素数ant
P1463 [SDOI2005]反素数ant 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i< ...
- 洛谷P2434 [SDOI2005]区间
题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...
- 洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)
题目背景 我们现有许多演讲要在阶梯教室中举行.每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的.现在我们想要尽最大可能的利用这个教室 ...
- 洛谷 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 ...
- 洛谷 2449 [SDOI2005]矩形
[题解] 因为这道题中n比较小,n^2效率是可以接受的. 枚举两个矩形,如果它们有重叠部分,就用并查集合并一下即可. #include<cstdio> #include<algori ...
- 洛谷 2434 [SDOI2005]区间
[题解] 鲜活的大水题... 把区间排个序然后瞎搞就可以了,发现现在区间的左端点比之前区间的最大的右端点还大,那就增加一个答案区间.每次更新目前最大右区间. #include<cstdio> ...
随机推荐
- ScaleIO 1.32现在可以免费下载安装使用了(除生产环境之外)
EMC World 2015会上宣布, ScaleIO 1.32可以免费下载使用在非生产环境上了. 这个可以免费下载的版本叫做Free and Drictionless (F&F) downl ...
- win7系统不能用telnet命令的两种解决方法
电脑专业人员对telnet命令都不陌生了,Telnet当成一种通信协议,在日常工作中,经常面对网络问题的人都会用到telnet命令,因为简单有效,可以帮助更快的找出问题.要是在使用过程中碰到win7纯 ...
- linux 如何正确的关闭mongodb
有的朋友说可以通过下面的命令关闭mongodb: killall mongodb #or kill -9 mongo-pid 上面的方法确实可以关闭mongodb,但是正确的做法不是这样子的,mong ...
- Python3 OpenCV应用
1.openCV介绍 openCV:Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.Open ...
- Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证
在JavaScript前端技术大行其道的今天,我们通常只需在后台构建API提供给前端调用,并且后端仅仅设计为给前端移动App调用.用户认证是Web应用的重要组成部分,基于API的用户认证有两个最佳解决 ...
- Java复习2-对象与类
回顾基础知识过程中遇到的感觉需要记录一下的知识点. 封装 我们设计的class应当尽可能的高内聚,体现为封装的程度.一个class的属性应该只能自己修改,其他class都只是与本class沟通,而不应 ...
- 【Spark】SparkStreaming-Kafka-集成-终极参考资料
SparkStreaming-Kafka-集成-终极参考资料 Spark Streaming和Kafka整合开发指南(二) – 过往记忆 Streamingkafka零丢失 | 等英博客 spark- ...
- 转:从头开始编写基于隐含马尔可夫模型HMM的中文分词器
http://blog.csdn.net/guixunlong/article/details/8925990 从头开始编写基于隐含马尔可夫模型HMM的中文分词器之一 - 资源篇 首先感谢52nlp的 ...
- Java Web 生成临时文件并下载(原)
概述:本文是 java 服务器端生成文件并下载的示例,并不完善,下载之后一般来说还需要删除临时文件. 注意:临时文件存放在 /WEB-INF/tmp 目录下,所以先要把 tmp 目录建起来. pu ...
- group by 深入总结(转)
http://www.cnblogs.com/wangtao_20/archive/2011/02/23/1959792.html 一.不兼容的语法问题. 先看使用如下sql:SELECT count ...