# bzoj1619【Usaco2008 Nov】Guarding the Farm 保卫牧场

## 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场

Time Limit: 5 Sec   Memory Limit: 64 MB
Submit: 606   Solved: 265
[ Submit][ Status][ Discuss]

## Description

The farm has many hills upon which Farmer John would like to place guards to ensure the safety of his valuable milk-cows. He wonders how many guards he will need if he wishes to put one on top of each hill. He has a map supplied as a matrix of integers; the matrix has N (1 < N <= 700) rows and M (1 < M <= 700) columns. Each member of the matrix is an altitude H_ij (0 <= H_ij <= 10,000). Help him determine the number of hilltops on the map. A hilltop is one or more adjacent matrix elements of the same value surrounded exclusively by either the edge of the map or elements with a lower (smaller) altitude. Two different elements are adjacent if the magnitude of difference in their X coordinates is no greater than 1 and the magnitude of differences in their Y coordinates is also no greater than 1.

## Input

* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: Line i+1 describes row i of the matrix with M space-separated integers: H_ij

## Output

* Line 1: A single integer that specifies the number of hilltops

8 7
4 3 2 2 1 0 1
3 3 3 2 1 0 1
2 2 2 2 1 0 0
2 1 1 1 1 0 0
1 1 0 0 0 1 0
0 0 0 1 1 1 0
0 1 2 2 1 1 0
0 1 1 1 2 1 0

3

## HINT

三个山丘分别是：左上角的高度为4的方格，右上角的高度为1的方格，还有最后一行中高度为2的方格．

## Source

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define MAXN 705
#define LL long long
using namespace std;
int n,m,cnt=0,ans=0,h[MAXN][MAXN];
bool vst[MAXN][MAXN];
struct data
{
int x,y;
}a[MAXN*MAXN];
const int dx[8]={-1,0,1,1,1,0,-1,-1},dy[8]={-1,-1,-1,0,1,1,1,0};
{
int ret=0,flag=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if (ch=='-') flag=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
ret=ret*10+ch-'0';
ch=getchar();
}
return ret*flag;
}
bool cmp(data d1,data d2)
{
return h[d1.x][d1.y]>h[d2.x][d2.y];
}
void dfs(int x,int y)
{
vst[x][y]=true;
F(i,0,7)
{
int tx=x+dx[i],ty=y+dy[i];
if (tx<1||tx>n||ty<1||ty>m) continue;
if (!vst[tx][ty]&&h[tx][ty]<=h[x][y]) dfs(tx,ty);
}
}
int main()
{
memset(vst,false,sizeof(vst));
F(i,1,n) F(j,1,m)
{
a[++cnt].x=i;
a[cnt].y=j;
}
sort(a+1,a+cnt+1,cmp);
F(i,1,cnt) if (!vst[a[i].x][a[i].y])
{
dfs(a[i].x,a[i].y);
ans++;
}
printf("%d\n",ans);
}