B4501 [GESP202603 四级] 山之谷
如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多8个方向)的海拔,则称该单元格为山谷。之后n行,每行包含m个整数(hi, h1), (hi, h2)...(hi, hm),表示海拔。现有一片山地,可以视为一个n行m列的网格图,第n行m列的海拔为hi, hj。输出1行,包含1个整数c,表示山谷的数量。1.可以用方向数组来表示每个海拔的8个方向。第一行包
·
题目描述
现有一片山地,可以视为一个n行m列的网格图,第n行m列的海拔为hi, hj。
如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多8个方向)的海拔,则称该单元格为山谷。
请你数一数该片山地中有多少山谷。
输入格式
第一行包含2个整数n,m表示山地的大小。
之后n行,每行包含m个整数(hi, h1), (hi, h2)...(hi, hm),表示海拔。
输出格式
输出1行,包含1个整数c,表示山谷的数量。
思路:
1.可以用方向数组来表示每个海拔的8个方向
2.可以用二维数组表示这片山地
3.判断时要注意只判断范围内的海拔
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
LL n, m, cnt = 0;
cin >> n >> m;
vector<vector<LL>> arry(n, vector<LL> (m));
for (LL i = 0; i < n; i++) {
for (LL j = 0; j < m; j++) {
cin >> arry[i][j];
}
}
LL dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
LL dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
for (LL i = 0; i < n; i++) {
for (LL j = 0; j < m; j++) {
bool flag = true;
for (LL k = 0; k < 8; k++) {
LL ni = i + dx[k];
LL nj = j + dy[k];
if (ni >= 0 && ni < n && nj >= 0 && nj < m) {
if (arry[ni][nj] < arry[i][j]) {
flag = false;
break;
}
}
}
if (flag) {
cnt++;
}
}
}
cout << cnt << endl;
return 0;
}
步骤:
1.定义方向数组和二维数组并完成输入
2.遍历二维数组并用方向数组进行判断
3.完成计数和输出
注意:
逻辑判断不要写错
不要越界访问
更多推荐



所有评论(0)