[POI2007]GRZ-Ridges and Valleys 题解
(2022-12-28 )
题目大意
找出一个图中所有大于(或小于)周围相邻的非连通块点的所有连通块个数。
就是说,对于一个连通块:
如果它周围的点都低于它,那么山峰数量 +1;
如果它周围的点都高于它,那么山谷数量 +1。
做法
直接dfs,不是很喜欢用bfs,感觉bfs写起来还挺麻烦的,而且可玩性没有dfs高。
我们dfs,同时返回一个状态值表示该点所到达的周围非连通块的情况:
1表示所到达点周围的非连通块点都小于连通块高度;
0表示所到达点周围的非连通块点都大于联通块高度;
-1则表示所到达点周围非连通块点高度情况不相同(有高有低)。
dfs的过程种有两种情况:
第一种:连通块点
用一个vis数组做标记,vis[x][y] = a表示坐标为\((x,y)\)的点已经被高度为a的连通块搜索过了。
然后搜索周围的上下左右八个点,同时保证没有越界,且没有被同种连通块搜过,统计返回值的情况:
如果都是 1,那么返回 1;
如果都是 0,那么返回 0;
如果有 1 和 0,或者有 -1,那么返回 -1。
第二种:非连通块点
直接返回 a[x][y] > num 的值。
代码
#include<bits/stdc++.h>
#define MAXn 1010
using namespace std;
int n;
int a[MAXn][MAXn];//图中各点高度
int vis[MAXn][MAXn];//标记数组
int high, low;//高的连通块个数,低的连通块个数
int d[3] = {-1, 0, 1};//坐标增量
int dfs(int x, int y, int num)
{
if(a[x][y] != num)//如果是非连通块点
return num > a[x][y];//返回连通块是否更高
vis[x][y] = num;//做标记
int res = 2;//返回结果统计值
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
{
if(x + d[i] < 1 || x + d[i] > n || y + d[j] < 1 || y + d[j] > n)//判断是否越界
continue;
if(vis[x + d[i]][y + d[j]] == num)//判断是否被同种连通块搜过
continue;
int tmp = dfs(x + d[i], y + d[j], num);//这个点 搜索结果
if(res == 2)//还没有统计过任何值,直接赋值
res = tmp;
else if(tmp == 2)//搜索结果为2表示这个点周围点都被搜过了
continue;
else if(tmp == -1)//直接置为-1
res = -1;
else if(res != tmp)//不相等置为-1
res = -1;
}
return res;
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(vis[i][j])//是否被搜过
continue;
int flag = dfs(i, j, a[i][j]);//该联通块搜索结果
if(flag == 1)
high++;
else if(flag == 0)
low++;
else if(flag == 2)//有个特例需要判断一下,既图中所有点都是同高度的,那么两者同时加1
low++, high++;
}
}
printf("%d %d", high, low);//输出结果
return 0;
}
[POI2007]GRZ-Ridges and Valleys 题解的更多相关文章
- BZOJ1102 [POI2007]GRZ山峰和山谷 [BFS]
题目传送门 GRZ山峰和山谷 Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量.给定一个地图,为FGD想要 ...
- 山峰和山谷 Ridges and Valleys
题目描述 思路 一开始看这道题目,也不是很会,谁会把统计之类的问题和bfs联系在一起,没有开始的状态,没有结束的状态,题目中连一个最短之类的词也没有出现. 然后统计嘛,题目中说了方格高度都相同,就把周 ...
- 洛谷 P3456 [POI2007]GRZ-Ridges and Valleys
P3456 [POI2007]GRZ-Ridges and Valleys 题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两 ...
- P3456 [POI2007]GRZ-Ridges and Valleys
题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相邻的格子.(所以与(i,j)相邻的格子有(i ...
- 「CSP-S模拟赛」2019第三场
目录 T1 「POI2007」山峰和山谷 Ridges and Valleys 题目 考场思路(几近正解) 正解 T2 「JOI 2013 Final」 现代豪宅 题目 考场思路(正解) T3 「SC ...
- 题解【洛谷P3456】[POI2007]GRZ-Ridges and Valleys
题面 考虑 \(\text{Flood Fill}\). 每次在 \(\text{BFS}\) 扩展的过程中增加几个判断条件,记录山峰和山谷的个数即可. #include <bits/stdc+ ...
- P3456 [POI2007]GRZ-Ridges and Valleys(bfs)
P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include& ...
- BZOJ1101 & 洛谷3455:[POI2007]ZAP——题解
https://www.luogu.org/problemnew/show/3455#sub http://www.lydsy.com/JudgeOnline/problem.php?id=1101 ...
- [POI2007]洪水pow 题解
[POI2007]洪水pow 时间限制: 5 Sec 内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...
- 题解 P3451 [POI2007]ATR-Tourist Attractions
题解 这里的做法是卡空间的做法,相比于滚动数组,这种做法因为没有三维数组寻址的大常数,所以较快. 在普通的做法中,\(dp[state][i]\) 表示以 \(i\) 结尾,那么 \(state\) ...
随机推荐
- 解密Elasticsearch:深入探究这款搜索和分析引擎
作者:京东保险 管顺利 开篇 最近使用Elasticsearch实现画像系统,实现的dmp的数据中台能力.同时调研了竞品的架构选型.以及重温了redis原理等.特此做一次es的总结和回顾.网上没看到有 ...
- Node + Express 后台开发 —— 上传、下载和发布
上传.下载和发布 前面我们已经完成了数据库的增删改查,在弄一个上传图片.下载 csv,一个最简单的后台开发就已完成,最后部署即可. 上传图片 需求 需求:做一个个人简介的表单提交,有昵称.简介和头像. ...
- Docker compose单机编排工具
Docker compose单机编排工具 目录 Docker compose单机编排工具 docker-compose介绍 Docker Compose使用的三步: docker-compose安装部 ...
- 2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,
2022-05-30:给定一个n*2的二维数组,表示有n个任务. 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务, ...
- 2022-01-27:供暖器。 冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。 在加热器的加热半径范围内的每个房屋都可以获得供暖。 现在,给出位于一条水平线上的房屋 hous
2022-01-27:供暖器. 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 在加热器的加热半径范围内的每个房屋都可以获得供暖. 现在,给出位于一条水平线上的房屋 hous ...
- mysql字段添加中文提示Data too long
解决方法: 新建一个数据库,字符集选择utf8
- 深入理解 python 虚拟机:魔术方法之数学计算
深入理解 python 虚拟机:魔术方法之数学计算 在本篇文章当中主要给大家介绍在 python 当中一些常见的魔术方法,本篇文章主要是关于与数学计算相关的一些魔术方法,在很多科学计算的包当中都使用到 ...
- docker部署gitlab CI/CD (一)第一篇:部署gitlab及汉化
网上很多类似教程,但多少有点夹带私货,有的竟然拉取的第三方镜像,而且很多都要修改配置文件,完全不知道是为什么,于是结合其他人的博客和官方文档,知其然也要知其所以然,于2023年4月17日写下这篇. 官 ...
- 第一单元 .Net 平台介绍
第一单元 .Net 平台介绍 学习编程,电脑基本配置(当然配置越高越好): 内存 :初期学习8 G,后期可能跟不上, 最好16 G以上 硬盘:500 G,5400 转速,至少C盘是固态,全是固态最好 ...
- 【Haxe】(一)VSCode 搭建 Haxe 开发环境
前言 咱换工作啦! 新工作这边需要用到的开发语言是 Haxe,最近大概会写几篇笔记.Haxe 的介绍就不写了,打算记录点有用的学习内容,先从搭建开发环境开始吧! 当前适用版本: VSCode:Curr ...