山峰和山谷
题目
输入
输出
输出一行两个整数,分别表示山峰和山谷的数量
输入样例
5
8 8 8 7 7
7 7 8 8 7
7 7 7 7 7
7 8 8 7 8
7 8 8 8 8
输出样例
2 1
解题思路
就从一个点开始搜,如果没有访问过就加入队列里,然后比较区域即可
程序如下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n, w[10001][10001], v[10001][10001], ans1, ans2;
const int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
bool e(int x, int y)
{
return 1 <= x && x <= n && 1 <= y && y <= n;
}
void bfs(int sx, int sy)
{
queue< pair<int, int> > q;
q.push(make_pair(sx, sy));
int val = w[sx][sy];
v[sx][sy] = true;
bool flag1 = false;
bool flag2 = false;
while(q.size())
{
pair<int, int> u = q.front();
q.pop();
int x = u.first, y = u.second;
for(int i = 0; i < 8; ++i)
{
int nx = x + dx[i];
int ny = y + dy[i];
if(e(nx,ny))
{
if(w[nx][ny] == val)
{
if(!v[nx][ny])
{
v[nx][ny] = true;
q.push(make_pair(nx,ny));
}
}
else
{
if(w[nx][ny] < val) flag1 = true;
if(w[nx][ny] > val) flag2 = true;
}
}
}
}
if(!flag1 && !flag2)
{
ans1++;
ans2++;
}
if(flag1 && !flag2) ans1++;
if(!flag1 && flag2) ans2++;
}
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
scanf("%d",&w[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",ans1, ans2);
return 0;
}