【ybtoj】【BFS】【例题2】山峰和山谷

【例题2】山峰和山谷


Link

传送门
题目


解题思路

一开始就是有点理解错题意了,对就酱,调了半个小时,一整个就是失语极了

周围只有高的,就是山谷
周围只有矮的,就是山峰
有高有矮,谷、峰都不是
没高没矮是山谷也是山峰


Code

#include <iostream>
#include <cstdio>

using namespace std;

const int way[8][2] = {
    
    {
    
    -1, 0}, {
    
    1, 0}, {
    
    0, -1}, {
    
    0, 1}, {
    
    -1, -1}, {
    
    -1, 1}, {
    
    1, -1}, {
    
    1, 1}};
int n, a[1010][1010], v[1010][1010], q[1000100][2], h, t, maxn, minn, ans_max, ans_min;

bool check(int x,int y) {
    
    
	return (x > 0 && x <= n && y > 0 && y <= n);
}

void BFS(int x, int y) {
    
    
	maxn = minn = h = t = 0;
	q[++t][0] = x, q[t][1] = y;
	while (h++ < t) {
    
    
		for (int i = 0; i < 8; i++) {
    
    
			int xx = q[h][0] + way[i][0];
			int yy = q[h][1] + way[i][1];
			if (check(xx, yy)) {
    
    
				if (a[xx][yy] == a[x][y]) {
    
    
					if (!v[xx][yy]) {
    
    
						v[xx][yy] = 1;
						q[++t][0] = xx, q[t][1] = yy;
					}
				}else {
    
    
					if (a[xx][yy] > a[x][y]) maxn++;//统计周围高的
					if (a[xx][yy] < a[x][y]) minn++;//统计周围矮的
				}
			}
		}
	}
	if (!minn) ans_min++;//周围没有矮的就是山峰
	if (!maxn) ans_max++;//周围没有高的就是山谷
}

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 (!v[i][j])
				BFS(i, j);
	printf("%d %d", ans_max, ans_min); 
}

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/112378994