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

P2919 [USACO08NOV]守护农场Guarding the Farm

题目描述

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;
}

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

时间: 2024-08-27 06:31:11

洛谷 P2919 [USACO08NOV]守护农场Guarding the Farm的相关文章

bzoj1619 / P2919 [USACO08NOV]守护农场Guarding the Farm

P2919 [USACO08NOV]守护农场Guarding the Farm 相似题:P3456 [POI2007]GRZ-Ridges and Valleys 每次bfs海拔相同的块,根据与周围的块的大小关系判断是否是山丘. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<cctype> 6 #define re

题解 P2919 【[USACO08NOV]守护农场Guarding the Farm】

rt 若地图中一个元素所邻接的所有元素都比这个元素高度要小(或它邻接的是地图的边界),则该元素和其周围所有按照这样顺序排列的元素的集合称为一个小山丘. 那么我们可以用一个结构体类型记录所有非零高度的横纵坐标以及相应的高度值 然后对高度进行排序 对每一次高度进行$dfs$ 及时删除所有的联通高度的小山丘 很显然 如果从一个给定高度的山丘的最高高度进行$dfs$ 一定可以将该山丘的所有高度清零 犯了一个很zz的错误 在递归调用的时候 $tmp$定义的全局变量 然后在递归调用的时候 在下一次递归结束

洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm

题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of  barns connected with  bidirectional paths between some pairs of barn

洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver

题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of NN barns connected with MM bidirectional paths between some pairs of

洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]

P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them play with intellectual toys. One of the larger toys is the lights in the barn. Each of the N (2 <= N <= 100,000) cow stalls conveniently numbered 1..N

洛谷 P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver

传送门 题目大意: n个谷仓 ,每次关闭一个谷仓,问剩下没被关闭的谷仓是 否联通. 题解:并查集+倒序处理 代码: #include<iostream> #include<cstdio> #include<cstring> #define N 3030 using namespace std; int n,m,sumedge,cnt; int head[N],fa[N],q[N],ans[N],exit[N]; struct Edge{ int x,y,nxt; Edg

洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i <= 25,000). The cows are so proud of it that each one now wears her number in a gangsta manner engraved in large le

洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 Every year in Wisconsin the cows celebrate the USA autumn holiday of Halloween by dressing up in costumes and collecting candy that Farmer John leaves in the N (1 <= N <= 100,000) stalls conven

洛谷 P2916 [USACO08NOV]为母牛欢呼Cheering up the C…

题目描述 Farmer John has grown so lazy that he no longer wants to continue maintaining the cow paths that currently provide a way to visit each of his N (5 <= N <= 10,000) pastures (conveniently numbered 1..N). Each and every pasture is home to one cow.