zoukankan      html  css  js  c++  java
  • BZOJ_1619_[Usaco2008_Nov]_Guarding_the_Farm_保卫牧场_(模拟+bfs)

    描述


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

    给出一张图每个点的高度,在一个点上安排守卫可以监视周围所有不高于于当前点的点.也就是类似在一个点上灌水,周围(8格)低于它的点都会有水,然后继续...求最少的守卫数.

    分析


    首先图中的最高点必须是要灌水的,所以就从当前最高的开始宽搜,有水的点标记掉就好了.

     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
    ",ans);
    40 }
    41 inline void init(){
    42     read(n); read(m);
    43     for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) read(Map[i][j]),a[(i-1)*m+j]=node(i,j,Map[i][j]);
    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.

     

    农夫JOHN的农夫上有很多小山丘,他想要在那里布置一些保镖(……)去保卫他 的那些相当值钱的奶牛们。 他想知道如果在一座小山丘上布置一名保镖的话,他总共需要招聘多少名保镖。他现在手头有一个用数字矩阵来表示地形的地图。这个矩阵有N行(1 < N < = 100)和M列( 1 < M < = 70) 。矩阵中的每个元素都有一个值H_ij(0 < = H_ij < =10,000)来表示该地区的海拔高度。请你帮助他统计出地图上到底有多少个小山丘。 小山丘的定义是:若地图中一个元素所邻接的所有元素都比这个元素高度要小(或它邻接的是地图的边界),则该元素和其周围所有按照这样顺序排列的元素的集合 称为一个小山丘。这里邻接的意义是:若一个元素与另一个横坐标纵坐标和它的横纵坐标相差不超过1,则称这两个元素邻接。 问题名称:guard 输入格式: 第一行:两个由空格隔开的整数N和M 第二行到第N+1行:第I+1行描述了地图上的第I行,有M个由空格隔开的整数:H_ij. 输入样例:(guard.in): 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 输出格式: 第一行:小山丘的个数 输出样例:(guard.out): 3 输出样例解释: 地图上有三个小山丘:每个小山丘的山峰位置分别在左上角(高度为4),右上角(高度为1)和底部(高度为2)。

    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

    HINT

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

    Source

  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5612174.html
Copyright © 2011-2022 走看看