Description

FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量。给定一个地图,为FGD想要旅行的区域,地图被分为\(n\times n\)的网格,每个格子(i,j) 的高度w(i,j)是给定的。若两个格子有公共顶点,那么他们就是相邻的格子。(所以与(i,j)相邻的格子有(i-1, j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1))。我们定义一个格子的集合S为山峰(山谷)当且仅当:1.S的所有格子都有相同的高度。2.S的所有格子都联通3.对于s属于S,与s相邻的s’不属于S。都有ws > ws’(山峰),或者ws < ws’(山谷)。你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。

Input

第一行包含一个正整数n,表示地图的大小(1<=n<=1000)。接下来一个\(n\times n\)的矩阵,表示地图上每个格子的高度。(0<=w<=1000000000)

Output

应包含两个数,分别表示山峰和山谷的数量。

Sample Input 1

5

8 8 8 7 7

7 7 8 8 7

7 7 7 7 7

7 8 8 7 8

7 8 8 8 8

Sample Output 1

2 1

Sample Input 2

5

5 7 8 3 1

5 5 7 6 6

6 6 6 2 8

5 7 2 5 8

7 1 0 1 7

Sample Outpu 2

3 3

HINT


bfs水题,为什么会有那么多人想到用dfs???应该是我太菜了……

bfs拓展的时候记录一下自己本身是山谷还是山峰,如果都是,那么不合法;如果都不是,两个答案都加;否则是哪个就加哪个

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=1e3;
const int dx[8]={-1,-1,-1,0,0,1,1,1};
const int dy[8]={-1,0,1,-1,1,-1,0,1};
int map[N+10][N+10];
int hx[N*N+10],hy[N*N+10];
bool vis[N+10][N+10];
int n,Peak,Valley;
bool in_map(int x,int y){return x>0&&x<=n&&y>0&&y<=n;}
void bfs(int x,int y){
int head=1,tail=1;
hx[1]=x,hy[1]=y,vis[x][y]=1;
bool peak=0,valley=0;//peak山峰,valley山谷
for (;head<=tail;head++){
int nx=hx[head],ny=hy[head];
for (int k=0;k<8;k++){
int tx=nx+dx[k],ty=ny+dy[k];
if (!in_map(tx,ty)) continue;
if (map[tx][ty]==map[nx][ny]&&!vis[tx][ty]){
hx[++tail]=tx,hy[tail]=ty;
vis[tx][ty]=1;
continue;
}
if (map[tx][ty]<map[nx][ny]) peak=1;
if (map[tx][ty]>map[nx][ny]) valley=1;
}
}
if (peak&&valley) return;
if (!peak&&!valley) Peak++,Valley++;
if (peak) Peak++;
if (valley) Valley++;
}
int main(){
n=read();
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) map[i][j]=read();
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (!vis[i][j]) bfs(i,j);
printf("%d %d\n",Peak,Valley);
return 0;
}

[POI2007]山峰和山谷Grz的更多相关文章

  1. bzoj1102: [POI2007]山峰和山谷Grz

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  2. 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz

    最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是 ...

  3. BZOJ1102 [POI2007]GRZ山峰和山谷 [BFS]

    题目传送门 GRZ山峰和山谷 Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量.给定一个地图,为FGD想要 ...

  4. 【POI 2007】 山峰和山谷

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1102 [算法] 广度优先搜索 [代码] #include<bits/stdc+ ...

  5. 山峰和山谷 Ridges and Valleys

    题目描述 思路 一开始看这道题目,也不是很会,谁会把统计之类的问题和bfs联系在一起,没有开始的状态,没有结束的状态,题目中连一个最短之类的词也没有出现. 然后统计嘛,题目中说了方格高度都相同,就把周 ...

  6. [原博客] POI系列(2)

    正规.严谨.精妙. -POI bzoj 1098 : [POI2007]办公楼biu 如果把互相有手机号的建边得到一个无向图,那么这个图的补图的连通分量个数就是答案了.因为互相没手机号的必然在同一个连 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. POI刷题记录

    POI2007 HNOI2018滚粗后,默默来刷POI 先从2007刷起 bzoj1103[POI2007]大都市meg bzoj1098[POI2007]办公楼biu bzoj1102[POI200 ...

  9. P3456 [POI2007]GRZ-Ridges and Valleys(bfs)

    P3456 [POI2007]GRZ-Ridges and Valleys 八个方向都跑一遍bfs,顺便判断一下是山峰还是山谷,或者是山坡(俩都不是) (实在不知道要说啥了qwq) #include& ...

随机推荐

  1. 如何把你的Windows PC变成瘦客户机

    越来越多的用户开始使用vmware view 4.5来做为企业桌面虚拟化的平台,通过view,所有的管理工作都转移到数据中心,但是考虑到成本原因,很多人员还在使用PC机,有没有办法将PC机变成瘦客户机 ...

  2. 【algorithm】尾递归

    尾递归和一般的递归不同在对内存的占用,普通递归创建stack累积而后计算收缩,尾递归只会占用恒量的内存(和迭代一样).SICP中描述了一个内存占用曲线,用以上答案中的Python代码为例(普通递归): ...

  3. CentOS 6.x DRBD

    CentOS 6.x DRBD 一.drbd概述     Distributed Replicated Block Device(DRBD)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的 ...

  4. Visual Studio VS如何重置所有设置

    工具-导入和导出设置-重置所有设置,点击下一步即可.                  

  5. powershell 通过SMTP发送邮件

    一直以来就用.net的方式发送邮件.由于powershell自带的方式用起来easy出错.且比較简单,近期看到一些人也反应使用中遇到麻烦. #定义函数 function sendmail($maila ...

  6. var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. sdut 面向对象程序设计上机练习四(变量引用)

    面向对象程序设计上机练习四(变量引用) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 将变量的引用作为函数形參,实现2个int型数据交换. 输入 输入2 ...

  8. xcode 程序配置 python 解释器嵌入

    1.点击项目->Buid Phases->加号点击 添加RunScript,Shell中写为python路径.一般是/usr/bin/python 2.同样是Build Phases中,L ...

  9. LiveWriter插入高亮代码插件介绍 基于SyntaxHighighter

    Codeint main() { int i; printf("%d",i); } 插件介绍 辛苦了两人小时写日志不小心浏览器崩溃了,发誓以后一定记得用Word先写好. 将Word ...

  10. 日元兑换——国内兑换需要护照和签证,国外的机场有兑换ATM

    在中国换日元:在中国的商业银行都可以换取日元,但是换汇者必须持有护照.签证等材料.换汇的汇率是按照即时汇率进行结算,如是现钞则按钞买价兑换,另外还要收取0.5%的手续费. 在日本换日元:除了在日本银行 ...