首页 > 编程知识 正文

bfsWZK旅游jzoj 1996

时间:2023-05-06 09:12:03 阅读:257882 作者:4184

WZK旅游 jzoj 1996 题目大意:

给出一个n×m的矩阵,表示一个地方的高度,高度相同且相邻(不算斜角)的算一块,当整一块高度都大于周围时,这是个山峰,相反当高度都低于附近时是湖泊,现在问你有多少个湖泊和山坡

输入样例#1 2 21 21 1 输入样例#2 3 41 3 2 61 2 2 73 2 2 5 输出样例#1 1 1 输出样例#2 1 3 样例解释#1

唯一的湖泊高度为1,存在的三个山峰高度分别为3,3和7。

数据范围

对于20%的数据: N,M ≤ 10。
对于60%的数据: N,M ≤ 100。
对于100%的数据: N,M ≤ 1000;高度信息 ≤ 1000000000。

解题思路:

枚举每一块,然后用bfs判断是否为湖泊或山坡即可

代码: #include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n,m,k,ans,sum,a[1500][1500],p[1500][1500];const int dx[4]={1,0,-1,0};const int dy[4]={0,1,0,-1};struct rec{int x,y;};int bfs(int x,int y){int xx,yy,num=0;queue<rec>d;d.push((rec){x,y});while(!d.empty()) { rec h=d.front(); d.pop(); for (int i=0;i<4;++i) { xx=h.x+dx[i]; yy=h.y+dy[i]; if (xx<=0||xx>n||yy<=0||yy>m) continue;//没出界 if (a[xx][yy]>a[h.x][h.y]) if (!num||num==1) num=1;//没有记录过或相同 else if (num==2) num=3;//违反了 if (a[xx][yy]<a[h.x][h.y]) if (!num||num==2) num=2;//同上 else if (num==1) num=3; if (!p[xx][yy]&&a[xx][yy]==a[h.x][h.y])//没到过并 { p[xx][yy]=1;//记录 d.push((rec){xx,yy}); } } }return num;}int main(){scanf("%d %d",&n,&m);for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) scanf("%d",&a[i][j]);for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) if (!p[i][j]) { p[i][j]=1; k=bfs(i,j); if (k==1) ans++;//湖泊 else if (k==2) sum++; }printf("%d %d",ans,sum);return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。