https://www.acwing.com/problem/content/description/1108/
思路:在bfs的时候,将相同高度的加入队列,和不同高度的比较,用两个flag标记一下就可以了_(:з」∠)_
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 1010;
typedef struct
{
int x, y;
}P;
int n, ans, res;
int a[maxn][maxn];
bool st[maxn][maxn];
int dx[8] = {1, 1, 1, 0, 0, -1, -1, -1}, dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
void bfs(int x, int y)
{
queue<P> q;
q.push({x, y});
st[x][y] = true;
int h = a[x][y];
int flag1, flag2;
flag1 = flag2 = 0;
while(q.size())
{
P t = q.front();
q.pop();
for(int i = 0;i < 8; i++)
{
int xx = t.x + dx[i];
int yy = t.y + dy[i];
if(xx < 1 || xx > n || yy < 1 || yy > n) continue;
if(a[xx][yy] == h && !st[xx][yy])
{
st[xx][yy] = true;
q.push({xx, yy});
}
else if(a[xx][yy] > h) flag1 = 1;
else if(a[xx][yy] < h) flag2 = 1;
}
}
if(!flag1) ans++;
if(!flag2) res++;
}
int main()
{
scanf("%d", &n);
for(int i = 1;i <= n; i++)
for(int j = 1;j <= n; j++)
scanf("%d", &a[i][j]);
ans = res = 0;
for(int i = 1;i <= n; i++)
{
for(int j = 1;j <= n; j++)
{
if(!st[i][j]) bfs(i, j);
}
}
printf("%d %d\n", ans, res);
return 0;
}