码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P2919 [USACO08NOV]守护农场Guarding the Farm

时间:2018-03-17 21:40:46      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:front   matrix   严格   一个   desc   AC   sticky   using   rds   

题目描述

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.

农场里有许多山丘,在山丘上约翰要设置哨岗来保卫他的价值连城的奶牛.

约翰不知道有多少山丘,也就不知道要设置多少哨岗.他有一张地图,用整数矩阵的方式描 述了农场N(1 <= N<=700)行M(1 < M<=700)列块土地的海拔高度好 H_ij (0 <= H_ij <= 10,000).请帮他 计算山丘的数量.

一个山丘是指某一个方格,与之相邻的方格的海拔高度均严格小于它.当然,与它相邻的方 格可以是上下左右的那四个,也可以是对角线上相邻的四个.

输入输出格式

输入格式:

 

* 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

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
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 
输出样例#1: 复制
3 

说明

There are three peaks: The one with height 4 on the left top, one of the points with height 2 at the bottom part, and one of the points with height 1 on the right top corner.

思路:搜索。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int h[702][702];
int n,m,ans,H,tot; 
struct po{
    int x,y,h;
}a[703*703];
queue<int>qx,qy;
int fx,fy,rx,ry;
bool v[1000][1000];
int X[8]={0,0,1,-1,1,-1,1,-1};
int Y[8]={1,-1,0,0,1,1,-1,-1};
int cmp(po xx,po yy){
    return xx.h>yy.h;
}
void bfs(int x,int y){
    v[x][y]=1;
    qx.push(x);qy.push(y);
    while(!qx.empty()){
        fx=qx.front();qx.pop();
        fy=qy.front();qy.pop();
        H=h[fx][fy];
        for(int i=0;i<=7;i++){
            rx=X[i]+fx;ry=Y[i]+fy;
            if(rx<1||rx>n||ry<1||ry>m)    continue;
            if(v[rx][ry])    continue; 
            if(h[rx][ry]<=H){
                  qx.push(rx);qy.push(ry);
                  v[rx][ry]=1;    
            }
          }    
    }
}
int main(){ 
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){

            tot++;
            scanf("%d",&a[tot].h);
            h[i][j]=a[tot].h;
            a[tot].x=i;a[tot].y=j;
         } 
    sort(a+1,a+tot+1,cmp);
    memset(v,0,sizeof(v));
    for(int i=1;i<=tot;i++){
        int xx=a[i].x,yy=a[i].y;
        if(v[xx][yy])    continue;
        bfs(xx,yy);
        ans++; 
    }
    cout<<ans;
}

 

洛谷 P2919 [USACO08NOV]守护农场Guarding the Farm

标签:front   matrix   严格   一个   desc   AC   sticky   using   rds   

原文地址:https://www.cnblogs.com/cangT-Tlan/p/8592677.html

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!