给出一个二维平面,以及在每一个位置上的高度
求有多少个山顶。(山顶可能大小不为1)
基本思想是,枚举每一个点,然后判断是否是山顶,对于每一个山顶dfs标记所有的相邻的矮的位置。
但是直接从1,1枚举到n,m。会出bug。
关键是需要先按高度排序,从高到矮做才不会有bug!!
思路需回顾
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
const int qx[]={0,0,1,-1,1,1,-1,-1};
const int qy[]={1,-1,0,0,-1,1,1,-1};
int n,m,h[1050][1050];
bool b[1050][1050];
bool ok(int x,int y)
{
if (x<1||x>n||y<1||y>m) return false;
return true;
}
bool pan(int x,int y)
{
int j;
for (j=0;j<8;j++)
if (ok(x+qx[j],y+qy[j]))
if (h[x][y]<h[x+qx[j]][y+qy[j]]) break;
return j==8;
}
void dfs(int x,int y)
{
if (b[x][y]) return ;
b[x][y]=true;
for (int i=0;i<8;i++)
if (h[x][y]>=h[x+qx[i]][y+qy[i]]) dfs(x+qx[i],y+qy[i]);
}
struct aa
{
int x,y,h;
bool operator <(const aa &b) const
{
return h>b.h;
}
}a[1000005];
int tot;
int main()
{
scanf("%d%d",&n,&m);
memset(b,true,sizeof(b));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) scanf("%d",&h[i][j]),b[i][j]=false,a[++tot]=(aa){i,j,h[i][j]};
int ans=0,x,y;
sort(a+1,a+tot+1);
for (int i=1;i<=tot;i++)
if (!b[a[i].x][a[i].y]&&pan(a[i].x,a[i].y))
{
ans++;
dfs(a[i].x,a[i].y);
}
printf("%d",ans);
return 0;
}