1113. 红与黑--Flood Fill 算法

目录

1113. 红与黑--Flood Fill 算法---宽搜(BFS)或DFS)

输入格式

输出格式

数据范围

输入样例:

输出样例:

思路:

1.BFS 思路:

2.DFS 思路

方法一:(BFS)代码:

方法二:深搜(DFS)代码:

运行结果:


1113. 红与黑--Flood Fill 算法---宽搜(BFS)或DFS)

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。

你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式

输入包括多个数据集合。

每个数据集合的第一行是两个整数 W 和 H,分别表示 x 方向和 y 方向瓷砖的数量。

在接下来的 HH 行中,每行包括 W 个字符。每个字符表示一块瓷砖的颜色,规则如下

1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

输出格式

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

数据范围

1≤W,H≤20

输入样例:
6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0
输出样例:
45
难度:简单
时/空限制:1s / 64MB
总通过数:31526
总尝试数:54082
来源:

《信息学奥赛一本通》

算法标签

DFSFlood Fill

思路:

1.BFS 思路:

偏移量:

2.DFS 思路

 

方法一:(BFS)代码:

#include <bits/stdc++.h>// 定义宏,便于快速访问 pair 类型中的元素
#define x first
#define y second// 引入标准命名空间
using namespace std;// 定义 pair 类型别名 PII,表示一对整数
typedef pair<int, int> PII;// 定义常量 N,表示矩阵的最大尺寸
const int N = 25;// 定义全局变量 g(存储矩阵)、n(矩阵行数)、m(矩阵列数)
char g[N][N];
int n, m;  // 矩阵行与列// 定义偏移量数组 dx 和 dy,用于计算相邻格子的坐标
int dx[4] = {-1, 0, 1, 0};  // 每个方向x方向的偏移量:上、右、下、左
int dy[4] = {0, 1, 0, -1};  // 每个方向y方向的偏移量:上、右、下、左// 广度优先搜索(BFS)函数,参数:起始位置的行坐标 sx 和列坐标 sy
// 返回值:从起始位置开始,能够搜索到的点(值为 '.') 的数量
int bfs(int sx, int sy) {queue<PII> q;  // 定义队列 q,用于存储待访问的格子坐标q.push({sx, sy});  // 将起始位置加入队列g[sx][sy] = '#';  // 将起始位置标记为 '#'int res = 0;  // 初始化搜索到的点的数量为 0// 当队列不为空时,持续进行广度优先搜索while (!q.empty()) {auto t = q.front();  // 取队首元素(当前待访问的格子坐标)q.pop();  // 出队,移除已访问的格子坐标res++;  // 计数器加一,表示找到一个可搜索的点// 遍历当前格子的四个相邻格子for (int i = 0; i < 4; i++) {int x = t.x + dx[i], y = t.y + dy[i];  // 计算相邻格子的坐标// 检查相邻格子是否在矩阵范围内、是否为 '.',若不符合条件则跳过if (x < 0 || x >= n || y < 0 || y >= m || g[x][y] != '.') continue;g[x][y] = '#';  // 将相邻格子标记为 '#',表示已访问q.push({x, y});  // 将相邻格子坐标加入队列,等待后续访问}}return res;  // 返回搜索到的点的数量
}int main() {// 循环读取多组测试数据,直到输入为 0 0while (cin >> m >> n, n || m) {// 读取当前矩阵数据for (int i = 0; i < n; i++) cin >> g[i];// 查找矩阵中 '@'(起始位置)的坐标int x, y;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (g[i][j] == '@') {x = i;y = j;}// 调用 BFS 函数,计算并输出能够搜索到的点的数量cout << bfs(x, y) << endl;}return 0;  // 主函数返回 0,表示程序正常结束
}

方法二:深搜(DFS)代码:

#include <bits/stdc++.h>using namespace std;// 定义全局变量 n(矩阵行数)、m(矩阵列数),以及矩阵 g
int n, m;
const int N = 25;
char g[N][N];// 定义偏移量数组 dx 和 dy,用于计算相邻格子的坐标
int dx[4] = {-1, 0, 1, 0};  // 水平方向的偏移量:左、中心、右、中心
int dy[4] = {0, 1, 0, -1};  // 垂直方向的偏移量:上、中心、下、中心// 深度优先搜索(DFS)函数,参数:当前格子的行坐标 x 和列坐标 y
// 返回值:以当前格子为根的连通区域中值为 '.' 的点的数量
int dfs(int x, int y) {int res = 1;  // 初始化结果为 1,表示当前格子本身是一个可搜索的点g[x][y] = '#';  // 将当前格子标记为 '#',表示已访问// 遍历当前格子的四个相邻格子for (int i = 0; i < 4; i++) {int a = x + dx[i];  // 计算相邻格子的行坐标int b = y + dy[i];  // 计算相邻格子的列坐标// 检查相邻格子是否在矩阵范围内、是否为 '.',若符合条件则递归搜索if (a >= 0 && a < n && b >= 0 && b < m && g[a][b] == '.')res += dfs(a, b);  // 将相邻格子的搜索结果累加到 res}return res;  // 返回以当前格子为根的连通区域中值为 '.' 的点的数量
}int main() {// 循环读取多组测试数据,直到输入为 0 0while (cin >> m >> n, n || m) {// 读取当前矩阵数据for (int i = 0; i < n; i++) cin >> g[i];// 查找矩阵中 '@'(起始位置)的坐标int x, y;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (g[i][j] == '@') {x = i;y = j;}// 调用 DFS 函数,计算并输出以起始位置为根的连通区域中值为 '.' 的点的数量cout << dfs(x, y) << endl;}return 0;  // 主函数返回 0,表示程序正常结束
}

         实现了一个简单的深度优先搜索(DFS)算法,用于在一个给定的矩阵中,从标记为 '@' 的起始位置开始,搜索并标记所有相邻且值为 '.' 的点。最终输出以起始位置为根的连通区域中值为 '.' 的点的数量。

运行结果:

 

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

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

相关文章

STM32H7的8个串口fifo收发(兼容232和485)

STM32H7的8个串口fifo收发&#xff08;兼容232和485&#xff09; 串口硬件串口时序串口高级特性同步和异步的区别单工、半双工、全双工的区别 STM32H78个串口fifo驱动定义数据结构uart_fifo.huart驱动包括中断配置等 应用示例RS485深入理解 仅供学习。 USART 的全称是 Universa…

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单&#xff0c;均尝试使用各种方法进行SQL注入 第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&…

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…

3dmax在线渲染怎么取消?怎么关闭云渲染

在线渲染&#xff0c;无论是通过云渲染服务还是渲染农场&#xff0c;已经成为众多3dmax动画制作者的首选方式来执行渲染任务。然而&#xff0c;如果在渲染过程中需要禁用这一在线渲染功能&#xff0c;该怎么操作呢&#xff1f;接下来&#xff0c;让我们一起探讨如何关闭这一功能…

【精读文献】Scientific data|2017-2021年中国10米玉米农田变化制图

论文名称&#xff1a;Mapping annual 10-m maize cropland changes in China during 2017–2021 第一作者及通讯作者&#xff1a;Xingang Li, Ying Qu 第一作者单位及通讯作者单位&#xff1a;北京师范大学地理学部 文章发表期刊&#xff1a;《Scientific data》&#xff08…

书生浦语学习第二课 轻松玩转书生浦语趣味Demo

本节课让同学们实践 4 个内容&#xff0c;分别是&#xff1a;部署 InternLM2-Chat-1.8B 模型进行智能对话、部署一期实战营优秀作品 八戒-Chat-1.8B 模型、 运行 Lagent 智能体 Demo、实践部署 浦语灵笔2 模型。 第一步&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Check Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Check Box的使用及说明 文章编号&#xff1a;…

CSS实现卡片在鼠标悬停时突出效果

在CSS中&#xff0c;实现卡片在鼠标悬停时突出&#xff0c;通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时&#xff0c;该元素的状态变化。通过:hover选择器&#xff0c;你可以定义鼠标悬停在元素上时元素的样式&#xff0c;比如改变颜色、…

基于Docker构建CI/CD工具链(七)使用Jmeter进行自动化压测

上一篇文章中&#xff0c;我们详细介绍了构建 Apifox Cli 的 Docker 镜像的步骤&#xff0c;并通过简单的示例演示了如何利用 GitLab 的 CI/CD 功能&#xff0c;将构建好的镜像利用在自动化测试作业中。在今天的文章中&#xff0c;我们将重点讨论如何构建 JMeter 的 Docker 镜像…

【Entity Framework】你知道如何处理无键实体吗

【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型&#xff1a;6…

csdn 博客怎么设置背景图

一、效果图 话不多说&#xff0c;先看效果图&#xff1a; 二、操作步骤 点击创作中心&#xff1a; 点击博客设置&#xff1a; 编辑博客设置&#xff1a; 点击保存&#xff1a; 三、自定义背景图 csdn不支持自定义背景图&#xff0c;只支持选择背景主题。 四、其它

大模型日报|今日必读的10篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.谷歌推出新型 Transformer 架构&#xff1a;反馈注意力就是工作记忆 虽然 Transformer 给深度学习带来了革命性的变化&#xff0c;但二次注意复杂性阻碍了其处理无限长输入的能力。 谷歌研究团队提出了一种新型 T…

【vue】Pinia-2 安装Pinia,使用store

1. 安装Pinia 在项目路径下执行npm install pinia 在package.json中查看 2. 使用store 在main.js中添加 import { createPinia } from pinia const pinia createPinia()修改createApp方法 最后示例如下&#xff08;三处修改&#xff09; import { createApp } from vue //…

Linux-docker安装数据库redis

1.拉取redis镜像 docker pull redis # 下载最新的redis版本 docker pull redis:版本号 # 下载指定的redis版本ps&#xff1a;我这是已经下载最新版本的redis 2.查看redis镜像 docker images3.创建挂在路径并授权 mkdir -p /usr/local/redis/data mkdir -p /usr/local…

Python 使用 pip 安装 matplotlib 模块(精华版)

pip 安装 matplotlib 模块 1.使用pip安装matplotlib(五步实现):2.使用下载的matplotlib画图: 1.使用pip安装matplotlib(五步实现): 长话短说&#xff1a;本人下载 matplotlib 花了大概三个半小时屡屡碰壁&#xff0c;险些暴走。为了不让新来的小伙伴走我的弯路&#xff0c;特意…

django celery 异步任务 异步存储

环境&#xff1a;win11、python 3.9.2、django 4.2.11、celery 4.4.7、MySQL 8.1、redis 3.0 背景&#xff1a;基于django框架的大量任务实现&#xff0c;并且需要保存数据库 时间&#xff1a;20240409 说明&#xff1a;异步爬取小说&#xff0c;并将其保存到数据库 1、创建…

MySQL 修改数据

目录 数据插入-insert 不指定列名插入&#xff1a; 插入整行数据 格式&#xff1a; 多行数据插入 格式&#xff1a; 指定列名插入 插入1行 插入多行 更新字段-update 语法&#xff1a; 删除表 语法&#xff1a; 案例&#xff1a; 数据插入-insert INSERT 将数据行…

【安全】查杀linux挖矿病毒 kswapd0

中毒现象 高cpu占用&#xff0c;使用top命令查看cpu使用率长时间50%以上&#xff0c;cpu占用异常的进程八成就是挖矿病毒进程 此病毒隐藏了自己&#xff0c;top命令无法查看到挖矿病毒进程&#xff0c;可通过sysdig命令找到隐藏进程 安装sysdig curl -s https://s3.amazonaw…