当前位置: 首页 > news >正文

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)算法,用于在一个给定的矩阵中,从标记为 '@' 的起始位置开始,搜索并标记所有相邻且值为 '.' 的点。最终输出以起始位置为根的连通区域中值为 '.' 的点的数量。

运行结果:

 

相关文章:

1113. 红与黑--Flood Fill 算法

目录 1113. 红与黑--Flood Fill 算法---宽搜&#xff08;BFS&#xff09;或DFS&#xff09; 输入格式 输出格式 数据范围 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 1.BFS 思路&#xff1a; 2.DFS 思路 方法一&#xff1a;&#xff08;BFS&#x…...

深入Java中间件:编程设计精粹

个人主页&#xff1a; 进朱者赤 阿里非典型程序员一枚 &#xff0c;记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; 引言 在Java中间件和框架里蕴藏着数不尽的编程设计精粹。这些设计不仅值得我们在日常编码…...

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸?

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸? 如下图所示,我们打开一份DWG格式的图纸文件,然后点击上方的“打印“图标, 如下图所示, 打印机/绘图仪这里选择“DWG To PDF“; 图纸尺寸:这里以普通的A4纸为例进行说明; 打印比例选择“布满图纸“; 打印偏移…...

unity socket udp 连接

使用此方法有助于udp在局域网内稳定的连接运行&#xff0c;已经过验证&#xff0c;为了保持彻底的稳定&#xff0c;可以考虑加入ping-pang进行网络处理&#xff0c;如果为了安全&#xff0c;请使用加密TCP 如果您要在大规&#xff0c;大项目的游戏中使用网络技术&#xff0c;建…...

【ensp】VLAN间通信的解决办法

目录 VLAN间通信简介 VLAN间通信的两种方式 借助三层设备路由器进行VLAN间的通信&#xff08;也就是单臂路由&#xff09; 在端口上创建子接口之后为什么需要开启arp广播&#xff0c;是因为他是子接口吗? 拓扑图 交换机配置 路由器配置 查看路由器配置 测试能否实现…...

接口测试框架搭建D22

整体架构和分层设计 run.py 运行测试用例&#xff0c;生成测试报告 test_cases/ 登录用例 注册用例 其他业务用例... data/ 测试数据 libs 第三方插件&#xff0c;比如HTMLTestRunnerNew config config.yaml 静态配置数据 config.py 动态配置数据 reports 测试报告…...

CASA模型教程

原文链接&#xff1a;CASA模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600635&idx6&sna655a8de570edcaa435d6e917b66d9b3&chksmfa82081ccdf5810a33a778e8771bb116bde9e5a1f795daa4894e5b74de17b03ebe86d7cdcfe3&token1464653739&…...

算法思路-遥感语义分割与变化检测

遥感影像存在的问题 1.不同季节影像的差异 2. 影像云雾遮挡 3.影像由于传感器、地物反射、地物高度差等导致的畸变 抛开数据&#xff0c;目前语义分割任务面临的问题 1. 单一任务模型很难具有通用性 结合自然语言的大模型是否会是一个新的启发点 首先需要考虑根据影像我…...

动态规划专练( 231.打家劫舍Ⅱ)

231.打家劫舍Ⅱ 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间…...

K-means和逻辑回归

逻辑回归 一个事件的几率是该事件发生的概率/该事件不发生的概率&#xff1a;P/&#xff08;1-P&#xff09; 对数几率是&#xff1a;log(P/&#xff08;1-P&#xff09;) **考虑对输入x分类的模型&#xff1a;**log(P/&#xff08;1-P&#xff09;)wx 则 Pexp(wx)/(exp(w*x)…...

3.2 iHRM人力资源 - 组织架构 - 编辑及删除

iHRM人力资源 - 组织架构 文章目录 iHRM人力资源 - 组织架构一、编辑功能1.1 表单弹层并数据回显1.2 编辑校验1.3 编辑 二、删除功能 一、编辑功能 编辑功能和新增功能用的组件其实是一个&#xff0c;结构几乎是一样的&#xff0c;其实是复用了组件&#xff0c;我们也省去了很…...

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址&#xff1a;https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念&#xff1a;FSM&#xff08;有限状态机&#xff09;&#xff0c;模式之间转换 状态机&#xff0c;也叫有限状态机&#xff08…...

rest_framework_mongoengine实现后端的增删改查

rest_framework_mongoengine实现后端增删改查 ‍ 一、增删改查 1. 继承ModelViewSet实现增删改查 父urls.py path("api/testapp/", include("apps.testapp.urls")), # 测试子urls.py # -*- coding: utf-8 -*- from django.urls import path from res…...

【精读文献】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…...

高光谱图像修复笔记

目录 RetinexFormer 也有MST-plus-plus代码&#xff0c;分辨率可以调 MST-plus-plus github地址&#xff1a; WACV2023 DSTrans RetinexFormer GitHub - caiyuanhao1998/Retinexformer: "Retinexformer: One-stage Retinex-based Transformer for Low-light Image E…...

GPS定位原理及应用分析

一&#xff0e;定位原理 1.卫星定位&#xff08;GPS&#xff0c;北斗导航&#xff09; ①&#xff0e;硬件构成&#xff08;24颗卫星&#xff0c;可构建一套导航系统&#xff09; 为何是24颗卫星&#xff1f; 可以做到全球覆盖&#xff0c;同一地点地球上空可观测到4颗卫星。 …...

Java面试篇9——并发编程

并发编程知识梳理 提示&#xff0c;此仅为面试&#xff0c;若想对线程有跟完整了解&#xff0c;请点击这里 提示&#xff1a;直接翻到最后面看面试真题&#xff0c;上面的为详解 面试考点 文档说明 在文档中对所有的面试题都进行了难易程度和出现频率的等级说明 星数越多代表…...

[RK3399 Linux] 使用busybox 1.36.1制作rootfs

一、 编译、安装、配置 busybox 1.1 下载源码 根文件系统是根据busybox来制作的。 下载地址:https://busybox.net/downloads/。 这里就以1.36.1版本为例进行编译安装介绍: 注意:编译linux内核与文件系统中的所有程序要使用相同的交叉编译器。 下载完成后解压: mkdir …...

JavaScript入门--循环

JavaScript入门--循环 一、for循环二、for in语句三、break语句四、continue语句五、while循环六、do-while语句一、for循环 先来看一个循环案例: for (i = 0; i < 5; i++) {...

【Delphi 爬虫库 1】GET和POST方法

文章目录 1.最简单的Get方法实现2.可自定义请求头、自定义Cookie的Get方法实现3.提取响应协议头4.Post方法实现单词翻译 爬虫的基本原理是根据需求获取信息并返回。就像当我们感到饥饿时&#xff0c;可以选择自己烹饪食物、外出就餐&#xff0c;或者订外卖一样。在编程中&#…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...