题意
棋盘每个数字表示高度,四周高中间低为山谷,反之为山峰,要求统计山峰和山谷的数量
思路
枚举每个点,对每个点进行对8个方向跑bfs,判断该方块周围的高度情况。
代码
#include<iostream>
#include<cmath>
#include<stack>
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define Endl "\n"
typedef long long ll;
const int maxn=1e3+5;
const int mod=1e9+7;
using namespace std;
int a[maxn][maxn];
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int n,ans1=0,ans2=0,high=0,low=0;
bool p[1005][1005];
struct location{
int x;
int y;
int height;
};
void bfs(int x,int y,int height)
{
queue<location> q;
location begin;
begin.x=x;
begin.y=y;
begin.height=height;
q.push(begin);
while(!q.empty())
{
location temp;
temp = q.front();
q.pop();
int xx=temp.x;
int yy=temp.y;
int key=temp.height;
// cout<<"------------"<<Endl;
for(int i=0;i<8;i++)
{
// cout<<"i="<<i<<Endl;
int nx = xx+dir[i][0];
int ny = yy+dir[i][1];
// cout<<"dir"<<dir[0][i]<<" "<<dir[1][i]<<Endl;
// cout<<"nx="<<nx<<" "<<"ny="<<ny<<Endl;
if(nx>=0&&nx<n&&ny>=0&&ny<n)
{
if(!p[nx][ny]&&a[nx][ny]==key)
{
location m;
m.x=nx;
m.y=ny;
m.height=key;
q.push(m);
p[nx][ny]=1;
}
if(a[nx][ny]<key) low++;
if(a[nx][ny]>key) high++;
// cout<<low<<" "<<high<<Endl;
}
}
// cout<<"------------"<<Endl;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>a[i][j];
p[i][j]=0;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(!p[i][j])
{
high = 0;
low = 0;
p[i][j]=1;
bfs(i,j,a[i][j]);
if(high&&low) continue;
else
if(high&&!low) ans1++;
else
if(!high&&low) ans2++;
}
}
if(!ans1&&!ans2)
cout<<"1 1"<<Endl;
else cout<<ans2<<" "<<ans1<<Endl;
return 0;
}