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

## 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

## Sample Input

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

## Sample Output

3


## Code

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 710
using namespace std;
struct node
{
int x,y,s;
};
node Edge[N*N];
int n,m,tot;
int map[N][N];
bool used[N][N];
int dir[8][2]={
0,1,
1,0,
-1,0,
0,-1,
1,-1,
-1,1,
-1,-1,
1,1
};

bool cmp(node a,node b)
{
return a.s>b.s;
}

bool is(int x,int y)
{
if(x<=0||x>n||y<=0||y>m)
return 1;
return 0;
}

void bfs(node u)
{
used[u.x][u.y]=true;
queue<node>Q;
Q.push(u);
while(!Q.empty())
{
node k=Q.front();
Q.pop();
for(int i=0;i<8;i++)
{
int xx=dir[i][0]+k.x;
int yy=dir[i][1]+k.y;
if(!map[xx][yy]||used[xx][yy]||is(xx,yy))
continue;
if(map[xx][yy]>map[k.x][k.y])
continue;
used[xx][yy]=true;
node p;
p.x=xx,p.y=yy;
Q.push(p);
}
}
}

int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
tot++;
Edge[tot].x=i,Edge[tot].y=j,Edge[tot].s=map[i][j];
}
}
sort(Edge+1,Edge+tot+1,cmp);
int ans=0;
for(int i=1;i<=n*m;i++)
{
node k=Edge[i];
if(!map[k.x][k.y]) break;
if(!used[k.x][k.y])
bfs(k),ans++;
}
cout<<ans<<endl;
return 0;
}

12-17 53

09-05 27
04-29 284
10-01 151
09-25 1369
01-25 192
07-21 42
05-20 347