博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YbtOJ——广度搜索【例题2】山峰和山谷
阅读量:2153 次
发布时间:2019-04-30

本文共 1169 字,大约阅读时间需要 3 分钟。

B. 【例题2】山峰和山谷

在这里插入图片描述

题解

先解释一下样例:

在这里插入图片描述
红笔圈着的是两个山峰,其余的形成一个山谷。


每次从未访问过的点开始BFS,对它相邻的点(八连通)进行搜索:

  • 若搜索的点等于当前点,则加入队列
  • 若搜索的点大于当前点,则标记它不可能为山峰
  • 若搜索的点小于当前点,则标记它不可能为山谷

代码

#include
#include
#include
#include
using namespace std;int n,a[1001][1001],ans1,ans2;int dx[8]= {
0,0,1,-1,1,1,-1,-1};int dy[8]= {
1,-1,0,0,1,-1,1,-1};bool f[1001][1001];struct node//结构体表示坐标{
int x,y;};bool check(int x,int y)//检查是否越界{
if(x>0&&y>0&&x<=n&&y<=n) return 1; else return 0; }void bfs(int x,int y){
f[x][y]=1;//标记为访问过 queue
q; q.push(node {
x,y}); bool hill=true,low=true; do {
node j=q.front(); q.pop(); for(int i=0; i<8; i++) {
int xx=j.x+dx[i],yy=j.y+dy[i]; if(check(xx,yy)) {
if(a[xx][yy]==a[j.x][j.y])//若搜索的点等于当前点,则加入队列 {
if(!f[xx][yy]) {
f[xx][yy]=1;//标记为访问过 q.push(node {
xx,yy}); } } else {
if(a[xx][yy]>a[j.x][j.y]) hill=false;//若搜索的点大于当前点,则标记它不可能为山峰 if(a[xx][yy]
>n; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) cin>>a[i][j];}void work(){ for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(!f[i][j]) bfs(i,j);}void out(){ cout<
<<" "<

转载地址:http://ghpwb.baihongyu.com/

你可能感兴趣的文章
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>
剑指offer 20.顺时针打印矩阵
查看>>
剑指offer 21.包含min函数的栈
查看>>
剑指offer 23.从上往下打印二叉树
查看>>
剑指offer 25.二叉树中和为某一值的路径
查看>>
剑指offer 60. 不用加减乘除做加法
查看>>
Leetcode C++《热题 Hot 100-13》234.回文链表
查看>>
Leetcode C++《热题 Hot 100-14》283.移动零
查看>>
Leetcode C++《热题 Hot 100-15》437.路径总和III
查看>>
Leetcode C++《热题 Hot 100-17》461.汉明距离
查看>>
Leetcode C++《热题 Hot 100-18》538.把二叉搜索树转换为累加树
查看>>
Leetcode C++《热题 Hot 100-19》543.二叉树的直径
查看>>
Leetcode C++《热题 Hot 100-21》581.最短无序连续子数组
查看>>
Leetcode C++《热题 Hot 100-22》2.两数相加
查看>>
Leetcode C++《热题 Hot 100-23》3.无重复字符的最长子串
查看>>
Leetcode C++《热题 Hot 100-24》5.最长回文子串
查看>>