山峰和山谷
题目链接:山峰和山谷
题目描述
解题思路
广搜模板题。
注意是八连通。
只有低,则山峰
只有高,则山谷
如果周围有高有低,则非山峰也非山谷。
如果没高也没底,则即使山峰又是山谷。
code
#include<iostream>
#include<cstdio>
using namespace std;
const int xn[9]={
0,0,1,0,-1,1,1,-1,-1};
const int yn[9]={
0,1,0,-1,0,1,-1,1,-1};
int n,sf,sg,ts;
int xx[10000000];
int yy[10000000];
int a[1010][1010];
int v[1010][1010];
void bfs(int sx,int sy)
{
int hd=0,tl=1;
int f=0,g=0;
xx[1]=sx,yy[1]=sy;
while(hd<tl)
{
hd++;
for(int i=1;i<=8;i++)
{
int x=xx[hd]+xn[i];
int y=yy[hd]+yn[i];
if(x<1||x>n||y<1||y>n)
continue;
if(a[x][y]==a[xx[hd]][yy[hd]]&&!v[x][y])
{
tl++;
xx[tl]=x;
yy[tl]=y;
v[x][y]=1;
}
{
if(a[x][y]>a[xx[hd]][yy[hd]])
g=1;
if(a[x][y]<a[xx[hd]][yy[hd]])
f=1;
}
}
}
if(g==1&&f==0)
sg++;
if(g==0&&f==1)
sf++;
}
int main()
{
cin>>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])
{
v[i][j]=1;
bfs(i,j);
ts++;
}
if(ts==1)
cout<<1<<" "<<1<<endl;
else
cout<<sf<<" "<<sg<<endl;
}