【BZOJ 1102】 [POI2007]山峰和山谷Grz

1102: [POI2007]山峰和山谷Grz

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 495  Solved: 263

[Submit][Status][Discuss]

Description

FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量。

给定一个地图,为FGD想要旅行的区域,地图被分为n*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*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

输入样例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 Output

输出样例1

2 1

输出样例2

3 3

HINT

直接暴力找即可。

dfs会爆栈,用bfs。

注意:只要有公共顶点格子就算是连通

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <queue>
#define mp make_pair
using namespace std;
queue<pair<int,int> > q;
int cnt,h,l,fx[10][3],v[1005][1005],w[1005][1005],n;
bool ok(int x,int y)
{
	if (x>0&&x<=n&&y>0&&y<=n)return true;
	return false;
}
/*void dfs(int x,int y)
{
	v[x][y]=1;
	for (int i=1;i<=8;i++)
	{
		int nx=x+fx[i][1],ny=y+fx[i][2];
		if (!ok(nx,ny)) continue;
		if (w[nx][ny]==w[x][y]&&!v[nx][ny])
		{
			dfs(nx,ny);
			continue;
		}
		if (w[nx][ny]==w[x][y]) continue;
		cnt++;
		if (w[nx][ny]>w[x][y]) h++;
		else l++;
	}
}*/
void bfs(int a,int b)
{
	q.push(mp(a,b));
	v[a][b]=1;
	while (!q.empty())
	{
		pair<int,int> p=q.front();
		q.pop();
		int x=p.first,y=p.second;
		for (int i=1;i<=8;i++)
		{
			int nx=x+fx[i][1],ny=y+fx[i][2];
			if (!ok(nx,ny)) continue;
			if (w[nx][ny]==w[x][y]&&!v[nx][ny])
			{
				v[nx][ny]=1;
				q.push(mp(nx,ny));
			}
			if (w[nx][ny]!=w[x][y])
			{
				cnt++;
				if (w[nx][ny]>w[x][y]) h++;
				else l++;
			}
		}
	}
}
int main()
{
	fx[1][1]=fx[2][1]=0,fx[1][2]=1,fx[2][2]=-1;
	fx[3][2]=fx[4][2]=0,fx[3][1]=1,fx[4][1]=-1;
	fx[5][1]=fx[6][1]=1,fx[5][2]=1,fx[6][2]=-1;
	fx[7][1]=fx[8][1]=-1,fx[7][2]=1,fx[8][2]=-1;
    scanf("%d",&n);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			scanf("%d",&w[i][j]);
	int sf=0,sg=0;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			if (!v[i][j])
			{
		        cnt=0,h=0,l=0;
				bfs(i,j);
                if (h==cnt) sg++;
				if (l==cnt) sf++;
			}
	printf("%d %d\n",sf,sg);
	return 0;
}

时间: 2024-08-29 10:28:57

【BZOJ 1102】 [POI2007]山峰和山谷Grz的相关文章

BZOJ 1102 POI2007 山峰和山谷Grz Floodfill

题目大意:给定一张地势图,求山峰和山谷的数量 直接Floodfill--注意DFS会爆栈,用BFS才能过 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1010 using namespace std; int n,ans1,ans2,a[M][M]; bool flag,v[M][M]; /* void Floodfill(in

BZOJ1102: [POI2007]山峰和山谷Grz

1102: [POI2007]山峰和山谷Grz Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 436  Solved: 227[Submit][Status] Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量. 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的. 若两个格子有公共顶点,那么他们就

[POI2007]山峰和山谷Grz

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)).我

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

最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*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.对于

(BFS) bzoj 1102

1102: [POI2007]山峰和山谷Grz Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 436  Solved: 227[Submit][Status] Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量.给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相

BZOJ 1098[POI2007]办公楼

题面: 1098: [POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1371  Solved: 641[Submit][Status][Discuss] Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼.FGD希望职员被安置在尽量多的办公楼当

bzoj 1101 [POI2007]Zap - 莫比乌斯反演

Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到你的帮助. Input 第一行包含一个正整数n,表示一共有n组询问.(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个 正整数,分别为a,b,d.(1<=d<=a,b<=50000) Output 对于每组询问,输出到输出文件zap.out一个正

BZOJ 1100: [POI2007]对称轴osi

1100: [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 630  Solved: 243[Submit][Status][Discuss] Description FGD小朋友--一个闻名遐迩的年轻数学家--有一个小MM,yours.FGD小朋友非常喜欢他的MM,所以他很乐意帮助他的MM做数学作业.但是,就像所有科学的容器一样,FGD的大脑拒绝不停地重复思考同样的问题.不幸的是,yours是一个十分用功的学生,所

BZOJ 1099([POI2007]树Drz-9次线段树&amp;分类讨论+线段树与插入顺序维护2个参数)

1099: [POI2007]树Drz Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 142  Solved: 55 [Submit][Status] Description CDQZ是一个偏远的小学校,FGD在学校里中了一排树.他却不喜欢这些树的顺序,因为他们高高矮矮显得那么参差不齐. FGD定义这些树的不整齐程度为相邻两树的高度差的和.设树高分别为h1,h2,h3,-,hn.那么不整齐程度定义为:|h1-h2|+|h2-h3|+--+|hn