题目描述

现有一片山地,可以视为一个 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;
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐