描述


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\n",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

Silver

转载于:https://www.cnblogs.com/Sunnie69/p/5612174.html

BZOJ_1619_[Usaco2008_Nov]_Guarding_the_Farm_保卫牧场_(模拟+bfs)相关推荐

  1. poj1426_模拟BFS

    题意:给出一个200以内的数n,求出这个数的倍数M,使得M中只有0和1组成.M最多100位. 分析:这个题竟然用的是bfs的思想.不看讨论真的想不出来.思路是这样的: 1.最高位一定是1.curnum ...

  2. bzoj 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场(DFS)

    1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 913  Solv ...

  3. 2020年上海市高等学校信息技术水平考试试卷_三级_数据科学技术及应用_模拟卷_四、操作题_答案

    2020年上海市高等学校信息技术水平考试试卷_三级_数据科学技术及应用_模拟卷_四.操作题_答案 (本试卷考试时间 150 分钟) 答案是自己做的,经验证,可成功运行. 内容仅供学习交流,不可转载. ...

  4. java模拟加速匀速减速_【JavaSE练习】面向对象_练习_模拟汽车的自动驾驶系统

    [JavaSE练习]面向对象_练习_模拟汽车的自动驾驶系统 [JavaSE练习]面向对象_练习_模拟汽车的自动驾驶系统 模拟汽车驾驶系统 定义一个交通工具的类,包括: 属性:速度 方法:设置速度,加速 ...

  5. UJNOJ_1307: 数独 [for ACMer]_模拟

    UJNOJ_1307: 数独 [for ACMer]_模拟 1307: 数独 [for ACMer] 内存限制:128 MB时间限制:10 S 评测方式:文本比较命题人:20151222169 提交: ...

  6. 2020年上海市高等学校信息技术水平考试试卷_三级_数据科学技术及应用_模拟卷_三、程序填空题_答案

    2020年上海市高等学校信息技术水平考试试卷_三级_数据科学技术及应用_模拟卷_三.程序填空题_答案 (本试卷考试时间 150 分钟) 答案是自己做的,经验证,可成功运行. 内容仅供学习交流,不可转载 ...

  7. Loi 模拟赛之压轴出场的互测终曲|(*_-) 模拟+模拟+贪心+bfs+图论+数论

    这份题内容比较基础,但是质量很高: 然而我还是GG了: T1: Problem 1 :令咒(order.cpp) 题目描述 当你终于打通 Codevs 钻石天梯, 成为一名 Master 后.在 11 ...

  8. csu 1536 Bit String Reordering(模拟 bfs+状态压缩)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 题意: 输入n个只为 0或1 的数 形成一个排列 再输入m个数 每个数代表 目标排列 (样例 ...

  9. scrapy模拟模拟点击_模拟大流行

    scrapy模拟模拟点击 复杂系统 (Complex Systems) In our daily life, we encounter many complex systems where indiv ...

  10. pytho简单爬虫_模拟登陆西电流量查询_实现一键查询自己的校园网流量

    闲来无事,由于校园内网络是限流量的,查询流量很是频繁,于是萌生了写一个本地脚本进行一键查询自己的剩余流量. 整个部分可以分为三个过程进行: 对登陆时http协议进行分析 利用python进行相关的模拟 ...

最新文章

  1. python 命令行参数处理 getopt模块详解
  2. mysql 使用表 语句_【mysql】mysql 经常使用建表语句
  3. es创建索引库,无法使用InetSocketTransportAddress
  4. linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
  5. python 异常函数调用栈_Python捕获异常堆栈信息的几种方法
  6. linux 加密我的主目录,NFS与加密的ubuntu主目录
  7. 年薪 66万+,西澳大学招聘 CV DL Research Fellow(研究员)
  8. Jabber 协议 概述
  9. 简述对linux系统的认识,对Linux的认识
  10. 数据结构之二叉树_二叉排序树(严蔚敏C语言版)
  11. 鸿蒙系统的结构图,一图看懂鸿蒙系统中的JS开发框架!
  12. 16kb等于多少b_MySQL为何选择B+树存储索引?
  13. RTI_DDS线程模型
  14. PPT的配色方法(师从于珞珈老师)
  15. 数学建模计算机部分知识,数学建模相关论文范文资料,与数学建模与计算机关系相关毕业论文题目范文...
  16. 装修纪~~从装修中体味人生
  17. LSF---【如何搭建SGE】
  18. 重新启动linux系统应使用 命令实现,在重新启动Linux系统的同时把内存中的信息写入硬盘,应使用哪个命令...
  19. AI帮我画出了小说里的人物,我这么多年的小说好像白看了。。。
  20. UGUI中实现文字下划线

热门文章

  1. Datawhale组队学习周报(第033周)
  2. 树莓派48/100 - 深入研究WS2812彩灯PIO汇编程序
  3. 算数-02-史丰收算法
  4. 2019全国大学生电子设计大赛-F题纸张计数
  5. 1006 换个格式输出整数——C++实现
  6. wed基础和http
  7. 五、python的数据容器(站在前辈们的肩膀上注入自己的理解,强势总结,适合入门,也适合复习)
  8. Hadoop解除安全模式
  9. 使用IDO Runtime Development Server跟踪IDO层的错误
  10. java中math中的指数是,java指数运算math