Flood Fill
文章目录
- 前言
- 一、Flood Fill
- 二、例题,代码
- AcWing 1097. 池塘计数
- 本题分析
- AC代码
- AcWing 1098. 城堡问题
- 本题分析
- AC代码
- AcWing 1106. 山峰和山谷
- 本题分析
- AC代码
- 三、时间复杂度
前言
复习acwing算法提高课的内容,本篇为讲解算法:Flood Fill,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
一、Flood Fill
Flood Fill算法是搜索的算法中的一种,用来解决类似田地覆盖这么一系列问题,算法核心是BFS
二、例题,代码
AcWing 1097. 池塘计数
本题链接:AcWing 1097. 池塘计数
本博客提供本题截图:
本题分析
本题就是水的覆盖问题,可以用bfs
去解,核心思路就是从第一行第一列(即图中的第一个元素)去遍历,这里需要一个bool st[N][N]
数组去记录这个点有没有被遍历过,如果被遍历过的话直接跳过这个点就可以了,我们每次挑选合适的点放入到队列之中,并用这个点作为“母点”去向8个方向去扩散,这里扩散的时候没有使用向量的方法,对于四扩散向量的方法很简单,但是对于8个方向的扩散,显然这里用一个二重for循环可以比较容易的解决问题,注意特判for循环中的条件,对于不符合条件的点continue
if (t.x == i && t.y == j) continue; //遍历到这个点的时候continue
if (i < 0 || i >= n || j < 0 || j >= m) continue; //越界的时候continue
if (g[i][j] == '.' || st[i][j]) continue; //这个点如果不是水的话或者这个点之前被遍历过的话就continue
这样三个if
判断之后的点一定是符合题意可以扩散水的点,那么就把这个点放到队列中,并把这个点的bool
值变成true
q[++ tt] = {i, j};
st[i][j] = true;
AC代码
#include <cstdio>
#include <algorithm>
#include <map>#define x first
#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 1010, M = N * N;PII q[M];
char g[N][N];
bool st[N][N];
int n, m, cnt;void bfs(int x1, int y1)
{int hh = 0, tt = 0;q[0] = {x1, y1};st[x1][y1] = true;while (hh <= tt){auto t = q[hh ++];for (int i = t.x - 1; i <= t.x + 1; i ++ )for (int j = t.y - 1; j <= t.y + 1; j ++ ){if (t.x == i && t.y == j) continue;if (i < 0 || i >= n || j < 0 || j >= m) continue;if (g[i][j] == '.' || st[i][j]) continue;q[++ tt] = {i, j};st[i][j] = true;}}
}int main()
{scanf("%d%d", &n, &m);for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ ) if (!st[i][j] && g[i][j] == 'W'){bfs(i, j);cnt ++;}printf("%d", cnt);return 0;
}
AcWing 1098. 城堡问题
本题链接:AcWing 1098. 城堡问题
本博客提供本题截图:
本题分析
和上一个题目基本一致,不同的有两点,一点是上一个题是八扩散,用的是两重for循环,这个题是四扩散,用的是向量,第二个不同是如何把数字形象化:位运算。
AC代码
#include <cstdio>
#include <map>
#include <algorithm>#define x first
#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 55, M = N * N;PII q[M];
int g[N][N];
bool st[N][N];
int n, m;int bfs(int x1, int y1)
{int area = 0;int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};int hh = 0, tt = 0;q[0] = {x1, y1};st[x1][y1] = true;while (hh <= tt){auto t = q[hh ++];area ++;for (int i = 0; i < 4; i ++ ){int a = t.x + dx[i], b = t.y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (g[t.x][t.y] >> i & 1) continue;if (st[a][b]) continue;q[++ tt] = {a, b};st[a][b] = true;}}return area;
}int main()
{scanf("%d%d", &n, &m);for (int i = 0; i < n; i ++ ) for (int j = 0; j < m ; j ++ )scanf("%d", &g[i][j]);int cnt = 0, area = 0;for (int i = 0; i < n; i ++ ) for (int j = 0; j < m; j ++ )if (!st[i][j]){cnt ++;area = max (area, bfs(i, j));}printf("%d\n%d\n", cnt, area);return 0;
}
AcWing 1106. 山峰和山谷
本题链接:AcWing 1106. 山峰和山谷
本博客提供本题截图:
本题分析
本题bfs
部分和第一个例题一致,都是八方向扩展,用两个for循环即可has_higer
是用来判断是否有比这个山高的,有的话返回ture
,low ++
,has_lower
用来判断是否有比这个山矮的,有的话返回true
,high ++
,注意我们在定义bfs
传递值得时候,has_higer
和has_lower
传递的是地址,所以在bfs
中修改这两个值在main
中可以改变,我们也可以定义成全局变量,这样就不需要传递地址了
AC代码
#include <cstdio>
#include <map>
#include <algorithm>#define x first
#define y secondusing namespace std;typedef pair <int, int> PII;const int N = 1010, M = N * N;int g[N][N];
bool st[N][N];
PII q[M];
int n;void bfs(int x1, int y1, bool &has_higher, bool &has_lower)
{int hh = 0, tt = 0;q[0] = {x1, y1};st[x1][y1] = true;while (hh <= tt){auto t = q[hh ++];for (int i = t.x - 1; i <= t.x + 1; i ++ ) for (int j = t.y - 1; j <= t.y + 1; j ++ ){if (i == t.x && j == t.y) continue;if (i < 0 || i >= n || j < 0 || j >= n) continue;if (g[i][j] != g[t.x][t.y]){if (g[i][j] > g[t.x][t.y]) has_higher = true;if (g[i][j] < g[t.x][t.y]) has_lower = true;}else if (!st[i][j]){q[++ tt] = {i, j};st[i][j] = true;}}}
}int main()
{scanf("%d", &n);for (int i = 0; i < n; i ++ ) for (int j = 0; j < n; j ++ ) scanf("%d", &g[i][j]);int high = 0, low = 0;for (int i = 0; i < n; i ++ ) for (int j = 0; j < n; j ++ ) if (!st[i][j]){bool has_higher = false, has_lower = false;bfs(i, j, has_higher, has_lower);if (!has_higher) high ++;if (!has_lower) low ++;}printf("%d %d\n", high, low);return 0;
}
三、时间复杂度
关于Flood Fill的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。
Flood Fill相关推荐
- LeetCode Number of Islands(flood fill)
问题:给出一个由0和1组成的二维网格图(m*n),1表示陆地,0表示水.要求统计有多少块陆地 思路:常见的flood fill算法有三种,深度优先搜索.广度优先搜索以及广度扫描法.广度扫描法其实原理与 ...
- flood fill算法
flood fill算法实现有三种形式 1.depth first search 2.breadth first search 3.breadth first scan 基本思想是找到还没有分配com ...
- usaco The Castle(flood fill)
问题:城堡有n*m个方块组成,方块四周可能有墙,分别用1(W),2(N),4(E),8(S)来表示,每个方块由一个数字来表示,由四周的分布的墙值和来表示.要求求出城堡有多少个房间,最大房间的大小及删除 ...
- 算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs
题目分析 来源:acwing 分析:这道题还是flood fill算法的应用,不同点在于八个方向扫描,习惯性采用二重循环来扫描周围的8个方向:其次,这里需要统计周围比它高的和比它矮的,这点用bool变 ...
- 算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs
题目分析 来源:acwing 分析:找房间个数,也就是找连通的个数. 样例画出来的房间个数如下图:其中'|' 和'-'不是墙,只有#是墙. 分析:这题不用建图,直接bfs(flood fill)来做, ...
- 算法提高课-搜索-Flood fill算法-AcWing 1097. 池塘计数:flood fill、bfs
Flood fill 算法简介: 像洪水一样,一圈一圈往外蔓延,像bfs. flood fill 算法可以在线性复杂度内,找到某个点所在的连通块. 题目分析 来源:acwing ac代码 #inclu ...
- C语言flood fill 泛洪算法(附完整源码)
C语言flood fill 泛洪算法 泛洪算法引出 C语言flood fill 泛洪算法完整源码(定义,实现,main函数测试) 泛洪算法引出 给定2D屏幕,像素的位置和要填充的颜色的新值,请用新颜色 ...
- 洪水填充算法_洪水填充(Flood fill)算法
洪水填充(Flood fill)算法 从一个起始节点开始把附近与其连通的节点提取出或填充成不同颜色颜色,直到封闭区域内的所有节点都被处理过为止,是从一个区域中提取若干个连通的点与其他相邻区域区分开(或 ...
- 图像处理------泛洪填充算法(Flood Fill Algorithm) 油漆桶功能
泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows paint的油漆桶功能.算法的原理很简单,就 ...
- AcWing 1113. 红与黑【《信息学奥赛一本通》】【DFS】【BFS】【Flood Fill】
AcWing 1113. 红与黑 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 解法一(BFS): 解法二(DFS): 四.其它题解 一.题目链接 AcWing 1113. ...
最新文章
- idea设置文件多行显示
- mysql锁简谈_mysql锁简谈
- 【LeetCode从零单排】No.7 Reverse Integer
- 为SQL Server创建基于“智能”触发器的审核跟踪
- oracle 二进制运算符,Oracle UNION运算符
- Android ToggleButton(状态切换按钮)
- openmp 第一次运行时间比较长_Android App 启动时间优化
- python计算图片的信源熵值(信息熵)
- 这篇文章告诉你PDF转WORD免费软件有哪些?
- centos7系统详细安装步骤
- 均值定理六个公式_三角形的面积公式九叙
- linux安装nginx防火墙,Centos7 防火墙关闭与nginx无法访问
- L130被围绕的区域
- 十年Java经验让我总结出了这些,什么是真正的架构设计?
- constrain用法_constrain是什么意思_constrain的用法
- 计算机主板电杆,嵌入式主板的常见故障解决办法
- java怎么获取屏幕PPI_智能手机屏幕清晰度用户体现的分析:PPI与PPI2
- 区域卫生平台用户分析
- 打开特斯拉App,自己的车变成了别人的车
- 黑鱼资源完整模板分享 已本地化CSS JS
热门文章
- N+1道Vue面试题,快来康康
- 手机端linux虚拟机,教你如何用「UTM虚拟机」让苹果手机运行Windows/安卓/Linux系统...
- 为什么高一的学生都说数学难?
- 伪码捕获matlab,直接序列扩频伪码捕获的matlab仿真
- vulnhub靶机-FIRSTBLOOD: 1
- 算法交易的成长与未来
- idea 项目jdk环境配置
- C# wave mp3 播放器探寻
- 西门菲莎大学计算机专业怎么样,西门菲莎大学
- 我的世界服务器物品栏mod,[娱乐|机械]Item Lore Stats —— 自定义物品[附带强化][1.7-1.10]...