1113. 红与黑--Flood Fill 算法

news2024/11/25 20:42:57

目录

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 0
    while (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 0
    while (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.coloradmin.cn/o/1589459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玉伯也创业了,曾经的互联网高P也慢慢的落幕了

玉伯是真创业还是被动创业&#xff1f;毕竟&#xff0c;在阿里的时候&#xff0c;他可是Ant Design和语雀的大佬&#xff0c;风光无限&#xff0c;谁都知道他的大名。但后来&#xff0c;他去了字节&#xff0c;待了不到一年就跑了&#xff0c;现在选择出来创业。是不是曾经的那…

文章分享:《二代测序临床报告解读指引》

&#xff3b;摘要&#xff3d; 二代测序&#xff08;next generation sequencing&#xff0c;NGS&#xff09;已成为中国临床肿瘤医生常用检测工具&#xff0c;而中国超 90%临床医生需要 NGS 报告解读支持。因此&#xff0c;为提升临床医生 NGS 报告解读能力&#xff0c;特编写…

ETL结合飞书快速实现业务信息同步

一、ETL工具介绍 ETLCloud数据集成平台是一款针对IT以及数据工程师推出的全域数据集成平台产品。它是集实时数据集成和离线数据集成以及API发布为一体的数据集成平台。与其他开源数据集成工具相比&#xff0c;系统采用轻量化架构、具有更快的部署速度、更快的数据传输速度、更…

宏景eHR customreport/tree SQL注入漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR customreport/tree 接口处存在SQL注入漏洞,未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令,从而窃取数据库…

HarmonyOS-数据请求(http / axios)

一、http数据请求 步骤&#xff1a; 1.在module.json5中申请ohos.permission.INTERNET权限 "module": {"requestPermissions": [{ "name": "ohos.permission.INTERNET" }],...} 2.在xxx.ets页面中导入&#xff1a;import http fro…

RPC简单介绍

Rpc框架&#xff0c;来为模块间远程功能交互提供⽀撑&#xff1b; 这个Rpc框架中有诸如RpcServer、RpcService、RpcSystem、RpcEndpoint等⼤量设计封装&#xff1b; 1. 基本概念 RPC&#xff1a;远程过程调⽤&#xff08;Remote Procedure Call&#xff09;&#xff1b; •…

库、框架、脚手架和IDE一文讲明白

在区分上面几个问题前&#xff0c;咱们先看看几个疑问。 一、常见问题汇总 js css直接复制到服务器 然后引用不就行了么&#xff1f; 为什么还需要安装&#xff1f; 引入js不就是引入了框架了吗&#xff1f;框架就是js&#xff1f; 脚手架和框架都有架&#xff0c;是不是一…

国家留学基金委(CSC)2024-2025年度中加学者交换项目开始申报

4月3日&#xff0c;国家留学基金委&#xff08;CSC&#xff09;发布了2024-2025年度中加学者交换项目遴选通知。根据通知精神&#xff0c;选派规模&#xff1a;100人月&#xff0c;留学及资助期限&#xff1a;4-12个月&#xff0c;网上报名截止日期至2024年6月30日。以下知识人…

基于SSM+Vue实现的宠物销售系统

基于SSMVue实现的宠物销售系统 系统介绍 系统演示 点击查看视频演示 基于SSMVue实现的宠物销售系统&#xff0c;主要实现的功能有以下几点&#xff1a;管理员&#xff1b;首页、个人中心、宠物分类管理、商品分类管理、宠物用品管理、宠物商店管理、宠物领养管理、用户管理…

UI状态伪类选择器

1.div::selection{background:yellow;color: red; } 鼠标选中后高亮状态的样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&…

题目:建造房屋 (蓝桥OJ3362)

问题描述: 代码: #include<bits/stdc.h> using namespace std; int n, m, k, ans, mod 1e9 7; long long dp[55][2605]; /*dp[i][j]&#xff1a;第i个街道上建j个房屋的总方案数枚举所有的转移&#xff0c;累加到dp[n][k]即总方案数 */ int main() {cin >> n &…

JavaEE 初阶篇-深入了解 CAS 机制与12种锁的特征(如乐观锁和悲观锁、轻量级锁与重量级锁、自旋锁与挂起等待锁、可重入锁与不可重入锁等等)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 乐观锁与悲观锁概述 1.1 悲观锁&#xff08;Pessimistic Locking&#xff09; 1.2 乐观锁&#xff08;Optimistic Locking&#xff09; 1.3 区别与适用场景 2.0 轻…

Linux虚拟网络设备:底层原理与性能优化深度解析

在深入探讨Linux虚拟网络设备的底层原理之前&#xff0c;重要的是要理解这些设备如何在Linux内核中实现&#xff0c;以及它们如何与操作系统的其他部分交互以提供高效且灵活的网络功能。虚拟网络设备在现代网络架构中发挥着关键作用&#x1f511;&#xff0c;特别是在云计算☁️…

Playwright录制脚本 —— web自动化测试!

简介&#xff1a; 在编写 web 自动化测试用例时&#xff0c;代码编写的速度是否快&#xff0c;会影响框架的使用体验。现在很多的框架都会提供一些辅助功能&#xff0c;帮助我们更快的去编写自动化测试代码&#xff0c;而录制功能是几乎所有的web自动化工具都会带的功能。在实际…

ASUS华硕灵耀Pro14笔记本AMD锐龙版M7400QC,M7600QA原厂Win11系统工厂包下载

恢复华硕灵耀14PRO出厂开箱状态预装OEM系统Windows11工厂模式安装包&#xff0c;带Recovery恢复还原功能 适用型号&#xff1a; M7400QC、M7400QE、M7400QEB M7600QC、M7600QE、M7600QA、M7600QCB 链接&#xff1a;https://pan.baidu.com/s/1dIGRAKJQLQt_JcKbQWFxJg?pwdbn…

VBA_NZ系列工具NZ05:VBA不打开工作簿获取其内容

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

一文读懂Partisia Blockchain,被严重低估的隐私区块链生态

在今年 3 月&#xff0c;隐私公链 Partisia Blockchain 迎来了重要的进展&#xff0c;该生态通证 $MPC 上线了交易所&#xff0c;目前 $MPC 通证可以在 Kucoin、Gate、BitMart、Bitfinex、Bitture 等平台交易&#xff0c;并将在不久后上线 MEXC 平台。 在上个月上线市场至今&am…

【C++ STL序列容器】deque 双端队列

文章目录 【 1. 基本原理 】【 1. deque 的创建 】1.1 创建一个空的 deque1.2 创建一个 n 个默认值的 deque1.3 创建一个 n 个指定值的 deque1.4 通过一个 deque 初始化另一个 deque1.5 通过基础容器来初始化 queue 容器适配器 【 3. deque 支持的成员函数 】 【 1. 基本原理 】…

【刷题】图论——最小生成树:局域网

要想去除边&#xff0c;并且不改变连通性&#xff0c;而且去除的值最大&#xff0c;相当于保留最小生成树。 注意这题连通块有若干个&#xff0c;所以运行Kruskal相当于形成若干个最小生成树。 如果是prim只能事先处理好各个连通块&#xff0c;然后在连通块内部单独用prim 题目…

电大搜题:为您解锁学习的新大门

近年来&#xff0c;随着社会的不断进步和教育的普及化&#xff0c;广大民众对学习的需求也越来越迫切。在这个信息爆炸的时代&#xff0c;大家对于获取准确、可靠学习资料的渴望日益增长。正是基于这样的背景&#xff0c;黑龙江开放大学&#xff08;简称黑开大&#xff09;与广…