BZOJ 1102 POI2007 山峰和山谷Grz Floodfill

题目大意:给定一张地势图,求山峰和山谷的数量

直接Floodfill……注意DFS会爆栈,用BFS才能过

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 1010using namespace std;int n,ans1,ans2,a[M][M];bool flag,v[M][M];/*void Floodfill(int x,int y){static const int dx[]={-1,-1,-1,0,0,1,1,1};static const int dy[]={-1,0,1,-1,1,-1,0,1};int i;v[x][y]=true;for(i=0;i<8;i++){int xx=x+dx[i],yy=y+dy[i];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(a[xx][yy]>a[x][y])flag=false;if(a[xx][yy]==a[x][y]&&!v[xx][yy])Floodfill(xx,yy);}}*/void Floodfill(int x,int y){static const int dx[]={-1,-1,-1,0,0,1,1,1};static const int dy[]={-1,0,1,-1,1,-1,0,1};static pair<int,int> q[M*M];int i,r=0,h=0;v[x][y]=true,q[++r]=make_pair(x,y);while(r!=h){x=q[h+1].first;y=q[h+1].second;q[++h]=make_pair(0,0);for(i=0;i<8;i++){int xx=x+dx[i],yy=y+dy[i];if(xx<=0||yy<=0||xx>n||yy>n)continue;if(a[xx][yy]>a[x][y])flag=false;if(a[xx][yy]==a[x][y]&&!v[xx][yy])v[xx][yy]=true,q[++r]=make_pair(xx,yy);}}}int main(){int i,j;cin>>n;for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&a[i][j]);for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(!v[i][j]){flag=true;Floodfill(i,j);ans1+=flag;}memset(v,0,sizeof v);for(i=1;i<=n;i++)for(j=1;j<=n;j++)a[i][j]=-a[i][j];for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(!v[i][j]){flag=true;Floodfill(i,j);ans2+=flag;}cout<<ans1<<' '<<ans2<<endl;return 0;}

,酒般的思念,一饮就醉,醉时就用全部的热情读这忧伤的月色,

BZOJ 1102 POI2007 山峰和山谷Grz Floodfill

相关文章:

你感兴趣的文章:

标签云: