bfsBZOJ1102- [POI2007]山峰和山谷Grz
Posted Yiyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bfsBZOJ1102- [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.对于s属于S,与s相邻的s’不属于S。都有ws > ws’(山峰),或者ws < ws’(山谷)。
你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。
【思路】
普通的bfs。判断是否是山峰和山谷的方法就是如果周围和它们不等高,那么就记下比它们高还是比它们低。最后如果统一高,就是山谷;统一低,就是山峰。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN=1000+5; 4 int w[MAXN][MAXN],vis[MAXN][MAXN]; 5 int peak,valley,higher,lower,n; 6 int dx[8]={1,1,1,-1,-1,-1,0,0}; 7 int dy[8]={0,1,-1,0,1,-1,1,-1}; 8 struct node 9 { 10 int x,y; 11 }; 12 queue<node> que; 13 14 void init() 15 { 16 peak=valley=0; 17 scanf("%d",&n); 18 for (int i=1;i<=n;i++) 19 for (int j=1;j<=n;j++) scanf("%d",&w[i][j]); 20 } 21 22 void bfs(int x,int y) 23 { 24 lower=higher=0; 25 while (!que.empty()) que.pop(); 26 que.push((node){x,y}); 27 vis[x][y]=1; 28 while (!que.empty()) 29 { 30 int hx=que.front().x,hy=que.front().y; 31 que.pop(); 32 for (int i=0;i<8;i++) 33 { 34 int xx=hx+dx[i],yy=hy+dy[i]; 35 if (xx<=0 || xx>n || yy<=0 || yy>n) continue; 36 if (w[xx][yy]==w[hx][hy] && !vis[xx][yy]) 37 { 38 que.push((node){xx,yy}); 39 vis[xx][yy]=1; 40 } 41 else 42 { 43 if (w[xx][yy]>w[hx][hy]) higher++; 44 else if (w[xx][yy]<w[hx][hy]) lower++; 45 } 46 } 47 } 48 if (higher==0 && lower!=0) peak++; 49 if (lower==0 && higher!=0) valley++; 50 } 51 52 void solve() 53 { 54 memset(vis,0,sizeof(vis)); 55 for (int i=1;i<=n;i++) 56 for (int j=1;j<=n;j++) 57 if (!vis[i][j]) bfs(i,j); 58 if (!peak && !valley) peak=valley=1; 59 printf("%d %d\n",peak,valley); 60 } 61 62 int main() 63 { 64 init(); 65 solve(); 66 return 0; 67 }
以上是关于bfsBZOJ1102- [POI2007]山峰和山谷Grz的主要内容,如果未能解决你的问题,请参考以下文章
map|BFSBZOJ 1627 [Usaco2007 Dec]穿越泥地