洛谷 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
分析:
从每一个白点出发做广搜去计算该白点到其他黑点的最短距离并做更新和记录的操作。
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("\n"); 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 }
洛谷 P2335 [SDOI2005]位图相关推荐
- 洛谷 2449 [SDOI2005]矩形
[题解] 因为这道题中n比较小,n^2效率是可以接受的. 枚举两个矩形,如果它们有重叠部分,就用并查集合并一下即可. 1 #include<cstdio> 2 #include<al ...
- 洛谷 P1463 [SDOI2005]反素数ant P1820 寻找AP数
传送门1 传送门2 这个题又是一个双倍经验题. 对于这种题,我的思路从来都是: 1.暴力打表 2.找规律 3.试着写正解 首先打表,我当时打出了小于等于100000的所有符合条件的数,直接看也没看出来 ...
- 洛谷--橙色百道DP总结
最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
- 洛谷 P1387 最大正方形
P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...
- 洛谷P2763 试题库问题
题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...
- 动态规划——洛谷_P1057传球游戏
题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...
- 洛谷P1417 烹调方案
洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...
最新文章
- 自然语言处理期末复习(6)话题模型
- Oracle 表的创建 及相关參数
- Horizon View 6-客户端连接虚拟桌面⑹
- 内存结构 堆 栈 全局区 常量区 代码区
- 王小川:与龚宇相识14年 爱奇艺造假不可能
- 那些有关求解next数组的算法
- 避免踩坑:易盾安全老司机起底Android九大漏洞,附解决建议
- request之额外路径
- Übersicht for mac(自定义桌面工具)v1.6(68)最新版
- RK3399的ADC配置指南
- 各种浏览器下的页面元素xpath获取方法
- 筛选法建立初始堆_MTT法检测细胞增殖
- 执行股票交易接口get提交方法如何获取三大指数的股票列表?
- 知网下载的PDF论文,如何加目录的方法
- css:使用div绘制一条竖线
- 小程序的三种生命周期
- 【数据库】ER模型的简单例子
- python sort 多级排序_python sort、sorted高级排序技巧
- CSS-border边框
- 在OpenCV里使用SVM识别手写数字