| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> BFS 之Flood Fill 算法(二) -> 正文阅读 |
|
[数据结构与算法]BFS 之Flood Fill 算法(二) |
在上一篇文章BFS 之Flood Fill 算法_Dream.Luffy的博客-CSDN博客中, ? 我们了解到Flood Fill算法的用途,以及如何使用,并给出了例题讲解,而本文是针对Flood Fill算法的习题练习篇。 例一: 城堡问题(来自于信息学奥赛一本通)
图1是一个城堡的地形图。 请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。 城堡被分割成?m?n个方格区域,每个方格区域可以有0~4面墙。 注意:墙体厚度忽略不计。 输入格式 第一行包含两个整数?m?和?n,分别表示城堡南北方向的长度和东西方向的长度。 接下来?m?行,每行包含?n?个整数,每个整数都表示平面图对应位置的方块的墙的特征。 每个方块中墙的特征由数字?P?来描述,我们用1表示西墙,2表示北墙,4表示东墙,8表示南墙,P?为该方块包含墙的数字之和。 例如,如果一个方块的?P?为3,则 3 = 1 + 2,该方块包含西墙和北墙。 城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。 输入的数据保证城堡至少有两个房间。 输出格式 共两行,第一行输出房间总数,第二行输出最大房间的面积(方块数)。 数据范围 1≤m,n≤50, 输入样例:
输出样例:
?算法分析: 首先,由题意可以得出该题考查的是连通性问题,故我们可以想到用Flood Fill算法来解决 本题是一个四连通问题(上下左右) 思考本题与上题的不同点 ①:地图的读入方式不同 ②:需要输出的结果不同 针对问题一:由于1表示西墙,2表示北墙,4表示东墙,8表示南墙,我们可以利用二进制数来表示一个格子在哪些地方有墙,哪些地方没墙 例如11的二进制表示: 1011? , 15的二进制表示: 1111 ,即四面都有墙? ?故我们可以利用二进制1的位置来判断每一面墙的位置(二进制的用法在这篇文章中有讲:状态压缩DP 图文详解(一)_Dream.Luffy的博客-CSDN博客 针对问题二:由于本题要求最大的房间数,我们可以维护一个变量,每次让BFS返回每个房间的大小,更新这个变量即可 上代码:
这里涉及一个位运算, >> 表示右移(即除以二), 例如二进制数1001 >> 1? 得到100, 11 >> 1 = 1; 位运算&: 只有两个数的同一位二进制都为1时才为1, 例如 100 & 101? = 101? , 111 & 001 = 1; 所以我们常用1 与一个数字相& ,来判断这个数字的最后一个二进制数是否为1。 ?例题二: ?山峰和山谷(来自于信息学奥赛一本通) FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。 为了能够对旅程有一个安排,他想知道山峰和山谷的数量。 给定一个地图,为FGD想要旅行的区域,地图被分为?n×n 的网格,每个格子?(i,j)?的高度?w(i,j) 是给定的。 若两个格子有公共顶点,那么它们就是相邻的格子,如与?(i,j)?相邻的格子有(i?1,j?1),(i?1,j),(i?1,j+1),(i,j?1),(i,j+1),(i+1,j?1),(i+1,j),(i+1,j+1)。 我们定义一个格子的集合?S?为山峰(山谷)当且仅当:
你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。 输入格式 第一行包含一个正整数?n,表示地图的大小。 接下来一个?n×n?的矩阵,表示地图上每个格子的高度?w。 输出格式 共一行,包含两个整数,表示山峰和山谷的数量。 数据范围 1≤n≤1000, 输入样例1:
输出样例1:
输入样例2:
输出样例2:
样例解释 样例1: 样例2: 算法分析:? 由题意知,本题是一个八连通问题, 八连通问题在上一文中讲过,这里就不再赘述 我们可以发现山峰,即山脉周围没有比它高的边界。 山谷即?山脉周围。 所以我们只需要在BFS过程中判断, ?是否存在比山脉高或低的边界。 代码如下:
该系列会持续更新, 我是Luffy,期待与你再次相遇 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:36:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |