ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

《ybtoj高效进阶》第一部分第五章例题2 山峰与山谷

2020-12-25 22:02:27  阅读:212  来源: 互联网

标签:velix 进阶 int ybtoj ak wj dx dy 例题


题目大意

输入一个n*n的矩阵,每一个权值相等的连通块,有:

  1. 当该连通块周围全都比它小,为山峰
  2. 当该连通块周围全都比它大,为山谷
  3. 如果全地图只是一个连通块,既是山峰也是山谷
  4. 否则,啥也不是

求山峰山谷个数.

思路

对于每一个连通块,求它是山峰还是山谷
code:

#include<iostream>
#include<queue>
using namespace std;
int q[8][2]={{0,1},{-1,0},{1,0},{0,-1},{-1,1},{1,-1},{1,1},{-1,-1}};
bool o1,o2;
int n,s1,s2;
struct f{
 int x,y;
} wj,ak,ioi;
queue<f> p,p2;
int a[1001][1001],w;
bool velix[1001][1001];
void bfs(int x,int y)
{
 p=p2;
 o1=o2=0;
 w=a[x][y];
 velix[x][y]=1;
 wj.x=x,wj.y=y;
 p.push(wj);
 while (p.size())
 {
  ak=p.front();
  p.pop();
  for (int i=0;i<8;i++)
  {
   int dx=ak.x+q[i][0],dy=ak.y+q[i][1];
   if (dx<1||dy<1||dx>n||dy>n) continue;
   if (a[dx][dy]==w&&velix[dx][dy]==0)
   {
    velix[dx][dy]=1;
    ioi.x=dx,ioi.y=dy;
    p.push(ioi);
   }
   if (a[dx][dy]>w)
   {
    o1=1;
   }
   if (a[dx][dy]<w) o2=1;
  }
 }
 if (o1==0&&o2==0) s1++,s2++;
 if (o1==1&&o2==0) s1++;
 if (o1==0&&o2==1) s2++;
 return;
}
int main()
{
 cin>>n;
 for (int i=1;i<=n;i++)
 {
  for (int j=1;j<=n;j++) cin>>a[i][j];
 }
 for (int i=1;i<=n;i++)
 {
  for (int j=1;j<=n;j++)
  {
   if (velix[i][j]==0)
   {
    bfs(i,j);
   }
  }
 }
 cout<<s2<<' '<<s1<<endl;
 return 0;
}

标签:velix,进阶,int,ybtoj,ak,wj,dx,dy,例题
来源: https://blog.csdn.net/weixin_49843717/article/details/111710734

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有