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

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

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 947  Solved: 425
[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的方格．

## Code

 1 #include<cstdio>
2 #include<iostream>
3 using namespace std;
4
5 const int dir[8][2] = {{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
6
7 int n,m,ans;
8 bool SPLASH[3000][3000],vis[3000][3000];
9 int map[3000][3000];
10
11 bool Judge(int x,int y,int nowx,int nowy,int high){
12     if(x < 1 || x > n || y < 1 || y > m || SPLASH[x][y]) return false;
13     if(high == map[nowx][nowy]) return map[x][y] < map[nowx][nowy];
14     else return map[x][y] <= map[nowx][nowy];
15 }
16
17 void flood(int nowx,int nowy,int high){
18     for(int i = 0;i < 8;i++){
19         int x = nowx+dir[i][0];
20         int y = nowy+dir[i][1];
21         if(Judge(x,y,nowx,nowy,high)){
22             SPLASH[x][y] = true;
23             flood(x,y,high);
24         }
25     }
26 }
27
28 void flood2(int nowx,int nowy){
29     for(int i = 0;i < 8;i++){
30         int x = nowx+dir[i][0];
31         int y = nowy+dir[i][1];
32         if(x >= 1 && x <= n && y >= 1 && y <= m && !SPLASH[x][y]){
33             SPLASH[x][y] = true;
34             flood2(x,y);
35         }
36     }
37 }
38
39 int main(){
40     scanf("%d%d",&n,&m);
41
42     for(int i = 1;i <= n;i++) for(int j = 1;j <= m;j++)
43         cin >> map[i][j];
44
45     for(int i = 1;i <= n;i++) for(int j = 1;j <= m;j++){
46         flood(i,j,map[i][j]);
47     }
48
49     for(int i = 1;i <= n;i++) for(int j = 1;j <= m;j++)
50         if(!SPLASH[i][j]){ans++,flood2(i,j);}
51
52 //    for(int i = 1;i <= n;i++){
53 //        for(int j = 1;j <= m;j++)
54 //            printf("%d ",SPLASH[i][j]?1:0);
55 //            cout << endl;
56 //    }
57 //
58 //    for(int i = 1;i <= n;i++) for(int j = 1;j <= m;j++)
59 //        if(!SPLASH[i][j]) ans++;
60 //
61     printf("%d",ans);
62
63     return 0;
64 } 
qwq

• 0
点赞
• 0
评论
• 0
收藏
• 一键三连
• 扫一扫，分享海报