1102: [POI2007]山峰和山谷Grz

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

 

 
暴力bfs搜索即可。。。
 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<algorithm>
 7 #include<string>
 8 #include<map>
 9 #include<queue>
10 #include<vector>
11 #include<set>
12 #define inf 1000000000
13 #define maxn 1000+5
14 #define maxm 1000+5
15 #define eps 1e-10
16 #define ll long long
17 #define for0(i,n) for(int i=0;i<=(n);i++)
18 #define for1(i,n) for(int i=1;i<=(n);i++)
19 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
20 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22 using namespace std;
23 queue<pair<int,int> >q;
24 int cnt,h,l,fx[10][3],v[maxn][maxn],w[maxn][maxn],n;
25 int read(){
26     int x=0,f=1;char ch=getchar();
27     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
28     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
29     return x*f;
30 }
31 bool ok(int x,int y){
32     if(x>0&&x<=n&&y>0&&y<=n)return true;
33     return false;
34 }
35 void bfs(int a,int b){
36     q.push(make_pair(a,b));
37     v[a][b]=1;
38     while(!q.empty()){
39         pair<int,int> p=q.front();
40         q.pop();
41         int x=p.first,y=p.second;
42         for1(i,8){
43             int nx=x+fx[i][1],ny=y+fx[i][2];
44             if(!ok(nx,ny))continue;
45             if(w[nx][ny]==w[x][y]&&!v[nx][ny]){
46                 v[nx][ny]=1;
47                 q.push(make_pair(nx,ny));
48             }
49             if(w[nx][ny]!=w[x][y]){
50                 cnt++;
51                 if(w[nx][ny]>w[x][y])h++;
52                 else l++;
53             }
54         }
55     }
56 }
57 int main(){
58     //freopen("input.txt","r",stdin);
59     //freopen("output.txt","w",stdout);
60     fx[1][1]=fx[2][1]=0,fx[1][2]=1,fx[2][2]=-1;
61     fx[3][2]=fx[4][2]=0,fx[3][1]=1,fx[4][1]=-1;
62     fx[5][1]=fx[6][1]=1,fx[5][2]=1,fx[6][2]=-1;
63     fx[7][1]=fx[8][1]=-1,fx[7][2]=1,fx[8][2]=-1;
64     n=read();
65     for1(i,n)
66         for1(j,n)
67             w[i][j]=read();
68     int sf=0,sg=0;
69     for1(i,n)
70         for1(j,n)
71             if(!v[i][j]){
72                 cnt=h=l=0;
73                 bfs(i,j);
74                 if(h==cnt)sg++;
75                 if(l==cnt)sf++;
76             }
77     printf("%d %d\n",sf,sg);
78     return 0;
79 }
View Code

 

posted @ 2016-05-29 19:56  HTWX  阅读(151)  评论(0编辑  收藏  举报