P1596 [USACO10OCT] Lake Counting S Flood Fill算法(洪水填充算法)

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
      • 算法原理
      • 实现方法
      • 复杂度分析
  • 代码实现
  • 总结


题目链接

链接: P1596 [USACO10OCT] Lake Counting S

题目描述

在这里插入图片描述

解题思路

本题我在acwing和洛谷上都看到了

做这道题首先要了解一下Flood Fill 算法(洪水填充算法)
作为一个广泛应用于计算机图形学和图像处理领域的经典算法,洪水填充算法(Flood Fill)在解决区域填充和区域标记等问题中具有重要地位。下面从算法原理、应用领域、实现方法和复杂度分析几个方面,介绍一下洪水填充算法。

算法原理

洪水填充算法的核心思想是从指定的种子点开始,向连通的方向进行“扩散”填充,直到满足某种特定条件或者不能继续填充为止。该算法通常使用深度优先搜索(DFS)或者广度优先搜索(BFS)来实现。在填充的过程中,需要考虑遍历的方向、种子点的选择、填充条件的判断等因素。

实现方法

洪水填充算法的一般实现方法包括:

  1. 递归实现:使用递归方式实现深度优先搜索,从种子点开始不断向相邻位置扩散。
  2. 队列实现:使用队列实现广度优先搜索,将种子点加入队列,依次取出队列中的点,并将其周围未填充的点加入队列。

复杂度分析

洪水填充算法的时间复杂度受填充区域的大小和形状影响,最坏情况下可达到 O(n * m),其中 n 和 m 分别表示区域的宽度和高度。空间复杂度取决于实现方式和填充区域的大小,递归实现通常需要考虑递归栈的空间占用,而队列实现则需要额外的空间来存储待扩散的点。

然后是这道题目的思路,这道题属于洪水填充算法的模板题,不是很难

这道题目的目标是统计一个矩阵中有多少个连通的地区,其中每个地区由字符 ‘W’ 表示。具体地,代码通过使用洪水填充算法(Flood Fill)来搜索连通的地区,并统计个数。

下面是这段代码的解题思路和总结:

  1. 理解题意和要求:首先需要理解题目要求,在这个问题中,我们需要统计一个矩阵中连通的地区的数量,其中连接由字符 ‘W’ 表示。通过理解题目要求,可以确定问题的目标和约束条件。

  2. 选择合适的算法:对于这个问题,由于需要统计连通的地区数量,并标记已经访问过的地区,可以选择使用洪水填充算法(Flood Fill)。

  3. 设计算法思路:在选择了洪水填充算法后,需要设计出基本的算法思路。代码中使用的 bfs 函数,通过广度优先搜索(BFS)的方式来实现洪水填充。具体来说,从每一个未被访问且为 ‘W’ 的位置开始,将其标记为已访问,然后将其周围未被访问且为 ‘W’ 的位置加入队列,直到队列为空。重复以上步骤,直到整个矩阵被遍历完,搜索到一个"W’点后,他的联通区域都的st数组 都会标记为false,所以有下面代码,所以每次搜索完,结果加一

if(!st[i][j]&&g[i][j]=='W'){bfs(i,j);cnt++;}
  1. 实现算法代码:将设计的算法思路转化为代码实现。代码中使用了队列来存储待访问的位置,使用一个二维数组 st 来记录已访问的位置。在主函数中,首先接收输入的矩阵大小和矩阵内容,然后调用 bfs 函数来统计连通的地区数量。

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=1010,M=N*N;
int n,m;
bool st[N][N];
PII q[M];
char g[N][N];
void bfs(int sx,int sy)
{int hh=0,tt=0;q[0]={sx,sy};st[sx][sy]=true;while(hh<=tt){PII 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<0||i>=n||j<0||j>=m) continue;if(st[i][j]||g[i][j]=='.') continue;if(t.x==i&&t.y==j) continue;st[i][j]=true;q[++tt]={i,j};}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%s",g[i]);int cnt=0;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;
}

总结

Flood Fill算法(洪水填充算法)模板题目,很适合新手练习
通过本篇博客的学习,对洪水填充算法有了全面的认识和了解,同时也能够发现该算法在实际问题中的广泛应用。希望读者通过阅读本篇博客,能够充分领略到算法的重要性和实用性,将所学知识应用到实际工作中,取得更大的成就和进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/442492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库MySQL查询设计||给定四个关联表,其定义和数据加载如下:-- 学生表 Student-- 选课表 SC

SQL查询设计 给定四个关联表&#xff0c;其定义和数据加载如下&#xff1a; -- 学生表 Student create table Student(Sno varchar(6), Sname varchar(10), Sdate datetime, Ssex varchar(10)); insert into Student values(01 , 赵雷 , 1999-01-01 , 男); insert into St…

重发布

一&#xff1a;作用 在两种路由协议之间&#xff0c;或者一个协议的不同进程之间&#xff0c;借助ASBR &#xff08;同时工作在两种协议或 者协 议的不同进程中&#xff09;学习到两个网络的路由信息&#xff0c;并且通过重发布进行路由共享&#xff0c;最终实现全网可 达。…

tarojs View多行文本无法换行问题解决

问题&#xff1a;未换行 code&#xff1a; 解决&#xff1a; 加上换行属性的css就好了 white-space: break-spaces;

(十一)springboot实战——springboot3下关于WebFlux项目的一些常用功能整合

前言 本节内容主要是对webflux项目一些常用功能的介绍&#xff0c;例如系统集成swagger接口文档&#xff0c;方便接口测试以及前后端项目联调测试&#xff1b;使用actuator完成系统各种指标的监控功能&#xff1b;系统使用logback日志框架完成项目日志的收集&#xff1b;使用过…

【python】在python中使用单元测试unittest

在python中使用单元测试unittest 大家好&#xff0c;欢迎来到我的技术乐园&#xff01;今天&#xff0c;我们将一起踏入Python单元测试的奇妙旅程&#xff0c;探索这个让我们的代码更可靠、更强壮的令人愉快的世界。 前言&#xff1a;为什么单元测试如此重要&#xff1f; 在我…

互联网加竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

StarRocks -- 基础概念(数据模型及分区分桶)

1. 数据模型 StarRocks提供四种数据模型&#xff1a; Duplicate Key, Aggregate Key, Unique Key, Primary Key 1.1 Duplicate Key 适用场景&#xff1a; 分析原始数据&#xff0c;如原始日志和原始操作记录。可以使用多种方法查询数据&#xff0c;不受预聚合方法的限制。加…

阿里十年 “帕鲁” 手把手带你 学习 ThreadLocal

阿里十年 “帕鲁” 手把手带你 学习 ThreadLocal 文章目录 阿里十年 “帕鲁” 手把手带你 学习 ThreadLocal前言目录ThreadLocal代码演示ThreadLocal的数据结构GC 之后 key 是否为 null&#xff1f;ThreadLocal.set()方法源码详解ThreadLocalMap Hash 算法ThreadLocalMap Hash …

Docker的使用方式

一、Docker概念 Docker类似于一个轻量的虚拟机。 容器和镜像是Docker中最重要的两个概念&#xff0c;镜像可以保存为tar文件&#xff0c;Dockerfile是配置文件&#xff0c;仓库保存了很多第三方已经做好的镜像。 基本指令 查找镜像 docker search nginx 拉取nginx镜像 do…

亚信安慧AntDB:AntDB-M元数据锁(十)

5.8 锁等待及通知 每个线程的锁上下文都有一个条件变量来进行锁等待。线程在没有获取锁的授权时&#xff0c;会将自己的ticket添加到锁对象的等待队列&#xff0c;并进入等待状态。等待队列的锁授予检测有3个时机&#xff1a; 1&#xff09;加锁申请阶段&#xff0c;hog,pigl…

海外云手机开辟企业跨境电商新道路

近几年&#xff0c;海外云手机为跨境电商、海外媒体引流、游戏行业等互联网领域注入了蓬勃活力。对于国内跨境电商而言&#xff0c;在亚马逊及其他平台上&#xff0c;短视频引流和社交电商营销成为最为有效的流量来源。如何通过海外云手机的助力&#xff0c;在新兴社交平台为企…

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…