[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\) ...
随机推荐
- 【H5】Emmet 指令 HTML
Emmet操作指南 HTML篇 生成带有内容的标签 标签名{内容}可以生成带有内容的标签 div{abc} <div>abc</div> 生成带有属性的标签 生成带有class ...
- Centos环境下部分中间件“rabbitmq、rocketmq、clickhouse”部署
部分中间件部署 目录 部分中间件部署 docker部署rabbitmq docker部署rocketmq 单机部署clickhouse docker部署rabbitmq # 拉镜像 docker pu ...
- 《 Istio 权威指南 》新著重磅发行!华为云云原生团队匠心力作
摘要:由 Istio社区指导委员会成员和华为云云原生团队联合编著的云原生服务网格书籍< Istio 权威指南>重磅上市 本文分享自华为云社区<< Istio 权威指南 > ...
- 2022-02-03:有一队人(两人或以上)想要在一个地方碰面,他们希望能够最小化他们的总行走距离。 给你一个 2D 网格,其中各个格子内的值要么是 0,要么是
2022-02-03:最佳的碰头地点. 有一队人(两人或以上)想要在一个地方碰面,他们希望能够最小化他们的总行走距离. 给你一个 2D 网格,其中各个格子内的值要么是 0,要么是 1. 1 表示某个人 ...
- React笔记-生命周期(七)
React笔记-生命周期(七) 生命周期值React组件从装载到卸载的全过程 在这个过程中React提供了多个内置函数供开发者在不同阶段执行需要的逻辑 状态组件由3个阶段组成 挂载阶段(MOUNTIN ...
- SQL:DATEDIFF和DATEADD函数
DATEDIFF和DATEADD函数.DATEDIFF函数计算两个日期之间的小时.天.周.月.年等时间间隔总数.DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期.要了解更多的DATE ...
- import MySQLdb as Database ModuleNotFoundError: No module named ‘MySQLdb‘
import MySQLdb as Database ModuleNotFoundError: No module named 'MySQLdb' import MySQLdb as Database ...
- C++程序开发技巧
引言 类(class)的使用分为两种--基于对象(object Based)和面向对象(object oriented) 基于对象是指,程序设计中单一的类,和其他类没有任何关系 单一的类又分为:不带指 ...
- 可视化生信分析利器 Galaxy 之 Docker 开发
1. 背景 我们常常会基于某个 image 来启动一个 container,在这个 container 中我们可能会执行某些操作,比如创建一个文件,但是当这个 container 退出以后,如果我们以 ...
- Post-Exploitation Basics
开发后基础知识 https://tryhackme.com/room/postexploit 使用 mimikatz.bloodhound.powerview 和 msfvenom 学习后期开发和维护 ...