# 描述

http://www.lydsy.com/JudgeOnline/problem.php?id=1619

# 分析

1 #include <bits/stdc++.h>
2 #define fst first
3 #define scd second
4 using namespace std;
5
6 typedef pair <int,int> P;
7 const int maxn=700+5;
8 struct node{
9     int x,y,d;
10     node(){}
11     node(int x,int y,int d):x(x),y(y),d(d){}
12     bool operator < (const node &a) const { return d>a.d; }
13 }a[maxn*maxn];
14 int n,m;
15 int go[][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
16 int Map[maxn][maxn];
17 bool vis[maxn][maxn];
18 P q[maxn*maxn];
19
20 inline int read(int &x){ x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k; }
21 inline void solve(){
22     int ans=0;
23     for(int i=1;i<=n*m;i++){
24         if(vis[a[i].x][a[i].y]) continue;
25         ans++;
26         int l,r;
27         q[l=r=1]=P(a[i].x,a[i].y);
28         while(l<=r){
29             P u=q[l++];
30             for(int j=0;j<8;j++){
31                 int dx=u.fst+go[j][0],dy=u.scd+go[j][1];
32                 if(Map[u.fst][u.scd]>=Map[dx][dy]&&!vis[dx][dy]){
33                     vis[dx][dy]=true;
34                     q[++r]=P(dx,dy);
35                 }
36             }
37         }
38     }
39     printf("%d\n",ans);
40 }
41 inline void init(){
44     sort(a+1,a+1+n*m);
45     for(int i=0;i<=m+1;i++) Map[0][i]=Map[n+1][i]=-1;
46     for(int i=0;i<=n+1;i++) Map[i][0]=Map[i][m+1]=-1;
47 }
48 int main(){
49     init();
50     solve();
51     return 0;
52 }
View Code

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

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 708  Solved: 315
[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

posted @ 2016-06-23 20:53  晴歌。  阅读(129)  评论(0编辑  收藏  举报