洛谷 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> ...
随机推荐
- CPLUSPLUS 获得 一个源文件的头文件依赖。即该文件所需要的所有头文件
核心命令:gcc -M *.h.*.cpp 转: 自动处理头文件的依赖关系 http://blog.csdn.net/su_ocean16/article/details/5374696 现在我们的M ...
- MultipleRegularExpressionAttribute MVC中扩展自定义验证规则
好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的.这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧 ...
- VS单元测试中Assert类的用法
首先说介绍一下,Assert类所在的命名空间为Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio ...
- Palindrome Number leetcode java
题目: Determine whether an integer is a palindrome. Do this without extra space. click to show spoiler ...
- 汉字转拼音 pinyin4j 字符串 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- JS的scrollIntoView简单使用
scrollIntoView方法滚动当前元素,进入浏览器的可见区域 el.scrollIntoView(); // 等同于el.scrollIntoView(true) el.scrollIntoVi ...
- 【转】深入理解line-height
原文: http://www.cnblogs.com/dolphinX/p/3236686.html https://www.cnblogs.com/yangjie-space/p/4858132.h ...
- Java-JUC(三):原子性变量与CAS算法
原子性 并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 可见 ...
- Hibernate中得fetch
fetch ,可以设置fetch = "select" 和 fetch = "join" 用一对多来举例:fetch = "select"是 ...
- SWIFT学习笔记05
1.Swift 无需写break,所以不会发生这样的贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answe ...