广度优先遍历算法-01寻找制高点问题
寻找制高点
- 前言
- 广度优先遍历算法在搜索答案时不像深度优先那样一条路走到底,而是采用由近及远的方式,先访问离起始点最近的所有点,再访问远一些的点。由于这种一层层搜索的策略,又叫做层次遍历算法。
- 简介
- 比较基础的BFS问题,但是是很多算法题的模板。
- 问题描述
- 现在,有一个矩阵,矩阵的每个值代表山的高度(均大于1),现在要求找到这个山的所有制高点。
- 制高点指的是通过这个点可以从上下左右四个边界走出去这个矩阵平面,注意,是四个边界都能走出去。
- 在整个平面的移动规则是从一个点只可以向上下左右四个方向走,并且只能走到不大于自己的值的位置上去。
- 问题分析
- 这是一个典型的搜索问题,一开始的思路一定是从每个位置出发搜索其能否到达四个边缘。很显然,对矩阵的每个值都要进行这样的搜索,显然,这样有些费时了。(如果在LeetCode上,这就是Exceed Time Limit报错)
- 那么,如何优化算法呢?
- 这条思路不行,那么就换一个思路处理问题,既然从每个点走向边缘的搜索有些低效,那么不妨以边缘的所有点为起点向内部进行搜索,看下一个节点是否不小于自己的值(这和下山的规则相反)。
- 标记能够到达的点为True,继续搜索,直到不能走为止。按照这样的思路,标记四个边界可以到达的点,都为True的点为制高点。(也就是四个集合的交集)
- 这就是典型的逆向思维,算法中经常要求这种逆向思维。
- 为了获取每个点,定义每个点的坐标为四个集合的记录值。
- 代码
# -*-coding:utf-8-*-def bfs(set_data, m, n, matrx):dir = [[0, 1], [0, -1], [1, 0], [-1, 0]]queue = list(set_data)while queue:x, y = queue.pop()for d in dir:nx, ny = x + d[0], y + d[1]if 0 <= nx < m and 0 <= ny < n:if matrix[nx][ny] >= matrix[x][y]: # 如果新点不低于自己则可以走if (nx, ny) not in set_data:queue.append((nx, ny))set_data.add((nx, ny))def solve(matrix):"""典型的BFS:return:"""m = len(matrix)n = len(matrix[0])top_point = set([(0, y) for y in range(n)])bottom_point = set([(m-1, y) for y in range(n)])left_point = set([(x, 0) for x in range(m)])right_point = set([(x, n-1) for x in range(m)])bfs(top_point, m, n, matrix)bfs(left_point, m, n, matrix)bfs(bottom_point, m, n, matrix)bfs(right_point, m, n, matrix)result = top_point & left_point & right_point & bottom_pointreturn resultif __name__ == '__main__':matrix = [[1, 3, 2, 3, 5],[3, 4, 5, 6, 3],[2, 7, 4, 3, 3],[5, 2, 2, 3, 1]]print(solve(matrix))
- 运行结果
- 补充说明
- 具体代码可以查看我的Github,欢迎Star或者Fork
- 参考书《你也能看得懂的Python算法书》
广度优先遍历算法-01寻找制高点问题相关推荐
- 深度、广度优先遍历算法python
文章目录 一.深度优先 1.怎么抓住小偷 2.二叉树中的最大路径和 3.最大的岛屿 二.广度优先 1.树的右侧 2.合法的括号 3.寻找制高点 4.选课的智慧 一.深度优先 该篇学习笔记来自于< ...
- python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法...
数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...
- 有向图的深度/广度优先遍历算法
// 邻接表存储与广度和深度优先算法 #include <iostream> using namespace std; #define MAX_VERTEX_NUM 100 typede ...
- 广度优先遍历算法-02合法的括号问题
合法的括号 简介 比较基础的BFS题目. 注意,由于要对不合法的字符串最小步数删减为合法的字符串,所以BFS合适. 之所以选择BFS,是因为要返回的结果为删减最小数目的括号后使字符串合法," ...
- 深度优先遍历算法-01小偷偷东西问题
小偷偷东西问题 前言 深度优先遍历是经典的图论算法,深度优先遍历算法的搜索逻辑和它的名字一样,只要有可能,就尽量深入搜索,直到找到答案,或者尝试了所有可能后确定没有解. 简单来说,深度优先遍历就是按照 ...
- 基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径
问题 假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少.采用广度优先遍历来实现. 基本思路 我们首先来看一下BFS的过程: 图片摘自慕 ...
- 简述树的深度优先及广度优先遍历算法,并说明非递归实现?
深度优先遍历二叉树. 1. 中序遍历(LDR)的递归算法: 若二叉树为空,则算法结束:否则: 中序遍历根结点的左子树: 访问根结点: 中序遍历根结点的右子树. 2. 前序遍历(DLR)的递归算法: 若 ...
- 以0结点为起点实现上述图的深度优先和广度优先遍历算法
MatGraph.h #pragma once #include <iostream> using namespace std;#define MAXV 7 //最大顶点个数 #defin ...
- Java实现图的深度和广度优先遍历算法
概述: 最近要学习写网络爬虫,所以把图的深度和广度搜索都再温习一下. 图结构展示: 实现过程: 首先,我们来看看图结构在代码中的实现.有三块逻辑: 1.图中的节点: public class Grap ...
最新文章
- 对标Bert?刷屏的GPT 2.0意味着什么
- 单片机有啥用?现在用的还多吗?
- controller是什么意思_光谈理论有什么意思,附源码带大家实操SpringBoot
- java 自定义对话框_Java经典实例:用户自定义对话框
- 如何一键部署项目代码自动更新
- Sublime Text3 配置设置攻略
- 如何理解 Linux 中的 load averages
- 无窗口激活ActiveX控件的bug
- 第八章:在Spark集群上掌握比较重要的图操作之Property Operators(2)
- Django中@login_required用法简介
- 2011计算机等级考试二级c语言公共基础教程.doc,2011年全国计算机等级考试二级c语言公共基础知识复习100题及答案.doc...
- Bootstrap 使用教程 与jQuery的Ajax方法
- 21天学通C语言-学习笔记(12)
- 人在职场,身不由己?
- 苹果录屏没声音_苹果iPhone手机没声音不会响 电话扬声器无法正常工作的修复方法...
- python工具脚本,网站广告违禁词检测脚本源码
- c#_Form调用另一个Form中的按钮和方法
- 人工智能课程今秋走入高中课堂
- 论文阅读:CNN+GCN
- tidymodels搞定二分类资料多个模型评价和比较