(2022-12-28 )

AcWing 1106

洛谷 P3456

题目大意

找出一个图中所有大于(或小于)周围相邻的非连通块点的所有连通块个数。

就是说,对于一个连通块:

如果它周围的点都低于它,那么山峰数量 +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 题解的更多相关文章

  1. BZOJ1102 [POI2007]GRZ山峰和山谷 [BFS]

    题目传送门 GRZ山峰和山谷 Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量.给定一个地图,为FGD想要 ...

  2. 山峰和山谷 Ridges and Valleys

    题目描述 思路 一开始看这道题目,也不是很会,谁会把统计之类的问题和bfs联系在一起,没有开始的状态,没有结束的状态,题目中连一个最短之类的词也没有出现. 然后统计嘛,题目中说了方格高度都相同,就把周 ...

  3. 洛谷 P3456 [POI2007]GRZ-Ridges and Valleys

    P3456 [POI2007]GRZ-Ridges and Valleys 题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两 ...

  4. P3456 [POI2007]GRZ-Ridges and Valleys

    题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相邻的格子.(所以与(i,j)相邻的格子有(i ...

  5. 「CSP-S模拟赛」2019第三场

    目录 T1 「POI2007」山峰和山谷 Ridges and Valleys 题目 考场思路(几近正解) 正解 T2 「JOI 2013 Final」 现代豪宅 题目 考场思路(正解) T3 「SC ...

  6. 题解【洛谷P3456】[POI2007]GRZ-Ridges and Valleys

    题面 考虑 \(\text{Flood Fill}\). 每次在 \(\text{BFS}\) 扩展的过程中增加几个判断条件,记录山峰和山谷的个数即可. #include <bits/stdc+ ...

  7. P3456 [POI2007]GRZ-Ridges and Valleys(bfs)

    P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include& ...

  8. BZOJ1101 & 洛谷3455:[POI2007]ZAP——题解

    https://www.luogu.org/problemnew/show/3455#sub http://www.lydsy.com/JudgeOnline/problem.php?id=1101 ...

  9. [POI2007]洪水pow 题解

    [POI2007]洪水pow 时间限制: 5 Sec  内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...

  10. 题解 P3451 [POI2007]ATR-Tourist Attractions

    题解 这里的做法是卡空间的做法,相比于滚动数组,这种做法因为没有三维数组寻址的大常数,所以较快. 在普通的做法中,\(dp[state][i]\) 表示以 \(i\) 结尾,那么 \(state\) ...

随机推荐

  1. KaiOS 2.5.X 使用 WebIDE 安装以及调试第三方应用程序

    本教程将展示使用 Waterfox Classic 安装为 KaiOS 2.5.x 设计的应用,同时我们也非常推荐使用它来进行安装和调试应用. 本教程本身不会对手机产生任何损害,但请注意,你必须信任你 ...

  2. #PowerBi 1分钟学会,以“万”为单位显示数据

    PowerBi是一款强大的数据分析和可视化工具,它可以帮助我们快速地制作出各种图表和报表,展示数据的价值和洞察. 但是,有时候我们的数据量太大,导致图表上的数字难以阅读和比较.例如,如果我们想要查看某 ...

  3. SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

    本文为千锋教育技术团独家创作,更多技术类知识干货,点个关注持续追更~ 接口幂等性是Web开发中非常重要的一个概念,它可以保证多次调用同一个接口不会对结果产生影响.如果你想了解更多关于接口幂等性的知识, ...

  4. 2022-10-30:给你一个长度为 n 的整数数组 rolls 和一个整数 k 。 你扔一个 k 面的骰子 n 次,骰子的每个面分别是 1 到 k , 其中第 i 次扔得到的数字是 rolls[i]

    2022-10-30:给你一个长度为 n 的整数数组 rolls 和一个整数 k . 你扔一个 k 面的骰子 n 次,骰子的每个面分别是 1 到 k , 其中第 i 次扔得到的数字是 rolls[i] ...

  5. 创建对象create()、批量创建bulk_create()、创建或更新update_or_create()、更新对象update()、更新或创建update_or_create()、删除对象delete()使用filter过滤、判断是否存在exists()、统计个数count()、聚合aggregate()

    创建对象create().批量创建bulk_create().创建或更新update_or_create().更新对象update().更新或创建update_or_create().删除对象dele ...

  6. SQL Server2019 新增字段并设置默认值

    命令: ALTER TABLE 表名 add 列名 数据类型 default 默认值 not null 例如: ALTER TABLE LJEL005H add el_req int default ...

  7. 代码随想录算法训练营Day24 回溯算法| 理论基础 77. 组合

    代码随想录算法训练营 回溯 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式. 在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯. 回溯是递归的副 ...

  8. AntV L7 快速入门示例

    1. 引言 L7 地理空间数据可视分析引擎是一种基于 WebGL 技术的地理空间数据可视化引擎,可以用于实现各种地理空间数据可视化应用.L7 引擎支持多种数据源和数据格式,包括 GeoJSON.CSV ...

  9. sqlmap工具学习

    tryhackme:sqlmap github:https://github.com/sqlmapproject/sqlmap kali集成 参数介绍 sqlmap -h ___ __H__ ___ ...

  10. 【GIS】图层中多个面要素融合成一个面要素

            对于那些利用GIS信息进行编辑,设计的GIS专业人士来说,桌面GIS占有主导地位.GIS专业人士使用标准桌面作为工具来设计,共享,管理和发布地理信息. ArcGIS Desktop是一 ...