· 题目描述
思路:
这道题就直接按照题目给的描述来做,每次判断一下这个是不是山峰或山谷就行了
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n, ans1, ans2;
int a[2000][2000];
int f[2000000][3];
bool v[2000][2000], v1[2000][2000];
int dx[8]={0, 1, 0, -1, 1, 1, -1, -1};
int dy[8]={1, 0, -1, 0, 1, -1, 1, -1};
int bfs(int x, int y)
{
f[1][1]=x;
f[1][2]=y;
v[x][y]=1;
int hd=0, tl=1, flag=1;
while(hd<tl)
{
hd++;
for(int i=0; i<8; i++)
{
int xx=f[hd][1]+dx[i],
yy=f[hd][2]+dy[i];
if(a[xx][yy]>a[f[hd][1]][f[hd][2]]&&a[xx][yy]!=0)
flag=0;
if(xx<1||xx>n||yy<1||yy>n||v[xx][yy])
continue;
if(a[xx][yy]==a[f[hd][1]][f[hd][2]])
{
tl++;
f[tl][1]=xx;
f[tl][2]=yy;
v[xx][yy]=1;
}
}
}
return flag;
}
int bfs1(int x, int y)
{
f[1][1]=x;
f[1][2]=y;
v1[x][y]=1;
int hd=0, tl=1, flag=1;
while(hd<tl)
{
hd++;
for(int i=0; i<8; i++)
{
int xx=f[hd][1]+dx[i],
yy=f[hd][2]+dy[i];
if(a[xx][yy]<a[f[hd][1]][f[hd][2]]&&a[xx][yy]!=0)
flag=0;
if(xx<1||xx>n||yy<1||yy>n||v1[xx][yy])
continue;
if(a[xx][yy]==a[f[hd][1]][f[hd][2]])
{
tl++;
f[tl][1]=xx;
f[tl][2]=yy;
v1[xx][yy]=1;
}
}
}
return flag;
}
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]==0)
{
int ss=bfs(i, j);
int ss1=bfs1(i, j);
ans1+=ss;
ans2+=ss1;
// cout<<ss<<' '<<ss1<<' '<<i<<' '<<j<<endl;
}
}
printf("%d %d", ans1, ans2);
return 0;
}