B4501 [GESP202603 四级] 山之谷 题解
·
题目描述
现有一片山地,可以视为一个 N 行 M 列的网格图,第 i 行 j 列的海拔为 hi,j。
如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 8 个方向)的海拔,则称该单元格为山谷。
请你数一数该片山地中有多少山谷。
输入格式
第一行包含 2 个整数 N,M,表示山地的大小。
之后 N 行,每行包含 M 个整数 hi,1,hi,2,⋯,hi,M,表示海拔。
输出格式
输出 1 行,包含 1 个整数 C,表示山谷的数量。
输入输出样例
输入 #1复制
3 5 7 6 6 7 9 6 5 6 7 6 6 5 7 8 9
输出 #1复制
3
说明/提示
样例解释
样例 1 如图所示,绿色单元格代表山谷:

数据范围
保证 1≤N,M≤100,1≤hi,j≤105。
AC代码
#include<bits/stdc++.h>
using namespace std;
int a[1000][1000];
bool f(int x,int y){
int zx=1e6;
zx=min(zx,a[x+1][y]);
zx=min(zx,a[x-1][y]);
zx=min(zx,a[x][y+1]);
zx=min(zx,a[x][y-1]);
zx=min(zx,a[x+1][y+1]);
zx=min(zx,a[x-1][y-1]);
zx=min(zx,a[x+1][y-1]);
zx=min(zx,a[x-1][y+1]);
if(a[x][y]>zx){
return false;
}
else{
return true;
}
}
int main(){
memset(a,0x7f,sizeof(a));
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int s=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(f(i,j)==true){
s++;
}
}
}
cout<<s;
return 0;
}
更多推荐


所有评论(0)