当前位置: 首页 > news >正文

信息学奥赛一本通 1454:山峰和山谷

【题目链接】

ybt 1454:山峰和山谷

【题目考点】

1. 网格图:连通块 深搜 广搜

【解题思路】

相同高度的相邻多个位置构成一个连通块。
设二维数组标记每个位置是否已访问过。
尝试从每个位置出发进行搜索(可以进行深搜或广搜)。
如果该位置没有访问过,则从该位置开始进行搜索。
访问某位置(sx,sy)后,尝试访问其周围(上、下、左、右、左上、右上、左下、右下)的位置(x,y),(x,y)位置需要保证在地图范围内且没有访问过。

  • 如果(x,y)位置的高度与(sx,sy)位置的高度相同,那么从(x,y)位置出发继续进行搜索。
  • 如果(x,y)位置的高度与(sx,sy)位置的高度不同,(x,y)位置就是(sx,sy)位置所属的连通块周围的一个位置。
    • 如果(x,y)位置比(sx,sy)位置更高,则记录周围存在比当前连通块更高的的位置。
    • 如果(x,y)位置比(sx,sy)位置更矮,则记录周围存在比当前连通块更矮的的位置。

当前连通块搜索结束后,

  • 如果周围只存在比当前连通块更高的位置,则当前连通块是山谷,山谷数量加1。
  • 如果周围只存在比当前连通块更矮的位置,则当前连通块是山峰,山峰数量加1。

最后输出山谷和山峰的数量。

【题解代码】

解法1:广搜 连通块

#include<bits/stdc++.h>
using namespace std;
#define N 1005
struct Pair
{int x, y;
};
int n, peak, valley, a[N][N], dir[8][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
bool vis[N][N], hasHigher, hasLower;
void bfs(int stx, int sty)
{hasHigher = hasLower = false;queue<Pair> que; que.push(Pair{stx, sty});vis[stx][sty] = true;while(!que.empty()){int sx = que.front().x, sy = que.front().y;que.pop();for(int i = 0; i < 8; ++i){int x = sx+dir[i][0], y = sy+dir[i][1];if(x >= 1 && x <= n && y >= 1 && y <= n){if(a[sx][sy] == a[x][y] && !vis[x][y]){vis[x][y] = true;que.push(Pair{x, y});}else if(a[sx][sy] < a[x][y])hasHigher = true;else if(a[sx][sy] > a[x][y])hasLower = true;}}}if(hasHigher && !hasLower)//只有比自己高的,没有比自己低的 valley++;else if(!hasHigher && hasLower)//只有比自己低的,没有比自己高的 peak++;else if(!hasHigher && !hasLower)//周围没有格子,自己是唯一的,是山峰也是山谷valley++, peak++; 
}
int main()
{cin >> n;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j) if(!vis[i][j])bfs(i, j);cout << peak << ' ' << valley;return 0;
}

解法2:深搜 连通块

#include<bits/stdc++.h>
using namespace std;
#define N 1005
int n, peak, valley, a[N][N], dir[8][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
bool vis[N][N], hasHigher, hasLower;
void dfs(int sx, int sy)
{vis[sx][sy] = true;for(int i = 0; i < 8; ++i){int x = sx+dir[i][0], y = sy+dir[i][1];if(x >= 1 && x <= n && y >= 1 && y <= n){if(a[sx][sy] == a[x][y] && !vis[x][y])dfs(x, y);else if(a[sx][sy] < a[x][y])hasHigher = true;else if(a[sx][sy] > a[x][y])hasLower = true;}}
}
int main()
{cin >> n;for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j) if(!vis[i][j]){hasHigher = hasLower = false;dfs(i, j);if(hasHigher && !hasLower)//只有比自己高的,没有比自己低的 valley++;else if(!hasHigher && hasLower)//只有比自己低的,没有比自己高的 peak++;else if(!hasHigher && !hasLower)//周围没有格子,自己是唯一的,是山峰也是山谷valley++, peak++; }cout << peak << ' ' << valley;return 0;
}

相关文章:

  • 优化PCB Via Stub系列(1):一次学会利用层叠设计降低Via Stub损耗
  • MySQL数据库全面详解:从基础到高级应用
  • ref 和$refs
  • 已知条件概率,反推设计值
  • 爱普生SG2520HHN晶振数据中心服务器的理想解决方案
  • 【Luogu】动态规划七
  • 推荐系统在线离线打分不一致:核心原因与全链路解决方案
  • fastapi和flaskapi有什么区别
  • 1.5 城镇道路工程安全质量控制
  • 在Java中基于Geotools对PostGIS数据库的空间查询实践
  • 探索无人机模拟环境的多元景象及AI拓展
  • RPC复习
  • 大模型高效化三大核心技术:量化、蒸馏与剪枝详解
  • 免布线视频桩与催缴系统:智慧停车管理的创新实践
  • Dify:让AI应用开发变得简单又高效
  • 塑料材料工程师简历模板
  • 2025年具身智能科技研报
  • 从零开始:Android Studio开发购物车(第二个实战项目)
  • 三轴云台之镜头解码技术篇
  • Laravel基础
  • 李在明涉嫌违反《公职选举法》案将于5月1日宣判
  • 特朗普的百日执政支持率与他“一税解千愁”的世界观和方法论
  • 央行副行长:增强外汇市场韧性,坚决对市场顺周期行为进行纠偏
  • 梅花画与咏梅诗
  • 规范涉企案件审判执行工作,最高法今天发布通知
  • 委员呼吁提高政府机构电话号码准确性,辽宁阜新回应