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);
}