C++ 数据结构之水洼的数量算法

C++ 数据结构之水洼的数量算法

问题描述

有一个矩阵区域,其中包含了若干个“水洼”,每个水洼是由相邻的“水滴”组成的区域。其中,相邻的“水滴”指的是上下左右四个方向上位置相邻的“.”,而不是斜对角线方向。

例如,下面的矩阵区域中,连续的“.”就构成了两个水洼:

X . . X .
X . . X .
. X X . .
. . . X .

现在,给定一个这样的矩阵,编写一个程序,计算其中的水洼数量。

解题思路

本题的基本思路是:遍历矩阵中的每个位置,如果当前位置是“.”并且还没有被访问过,就从该位置开始进行深度优先搜索(DFS),找到与该位置相邻且为“.”的所有位置,将它们标记为已经访问过,并继续向下进行DFS。最终,每次对未访问过的“.”进行DFS就可以找到一个新的水洼,最终得到的DFS深度总数就是水洼的大小。

// 定义矩阵大小
#define MAXN 1001

// 定义矩阵和标记数组
char mat[MAXN][MAXN];
bool vis[MAXN][MAXN];

// DFS函数进行搜索,并标记已经访问过的位置
void dfs(int x, int y) {
    // 标记当前位置为已经访问过
    vis[x][y] = true;
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    for(int i = 0; i < 4; ++i) {
        int nx = x + dx[i], ny = y + dy[i];
        // 判断是否越界或者不是水洼
        if(nx >= 0 && nx < n && ny >= 0 && ny < m && mat[nx][ny] == '.'&& !vis[nx][ny]) {
            dfs(nx, ny);
        }
    }
}

int main() {
    // 读入矩阵的大小和矩阵本身
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; ++i) {
        scanf("%s", mat[i]);
    }
    // 初始化标记数组
    memset(vis, false, sizeof(vis));
    int count = 0;
    // 遍历每个位置
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            // 如果是 "." 并且还没有被遍历过,就进行DFS
            if(mat[i][j] == '.' && !vis[i][j]) {
                count++; // 计数器加1
                dfs(i, j);
            }
        }
    }
    printf("%d\n", count); // 输出水洼的数量
    return 0;
}

其中,mat数组表示矩阵,它的每一行对应一个字符串,而每个字符串中的每个字符表示该位置上的“水滴”或者其他障碍物。vis数组表示标记数组,它表示每个位置是否已经被遍历过。

下面是两个具体的例子。

示例说明

示例 1

4 5
X . . X .
X . . X .
. X X . .
. . . X .

输入以上矩阵后,程序应该输出:

2

这是因为该矩阵中包含两个水洼。

示例 2

3 3
. . .
. . .
. . .

输入以上矩阵后,程序应该输出:

0

这是因为该矩阵中没有水洼。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 数据结构之水洼的数量算法 - Python技术站

(1)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++如何调用opencv完成运动目标捕捉详解

    C++如何调用OpenCV完成运动目标捕捉,以下是详细攻略。 准备工作 在使用OpenCV前,需要安装OpenCV库。可以从OpenCV的官方网站(https://opencv.org/)下载,安装后需要在编译时链接到相关的库文件。 加载视频文件 首先需要加载视频文件,使用OpenCV中的cv::VideoCapture类。该类的构造函数接受视频文件路径作为…

    C 2023年5月23日
    00
  • Python实现将json文件生成C语言的结构体的脚本分享

    下面为你提供 Python 实现将 json 文件生成 C 语言的结构体的脚本分享的完整攻略,具体步骤如下: 1. 安装必要的库 在使用过程中,需要使用 Python 的 json 模块和 os 模块,需要安装,可以使用下面的命令进行安装: pip install json pip install os 2. 读取 json 文件 使用 Python 的 j…

    C 2023年5月23日
    00
  • Photoshop 打造溶液字母文字特效

    Photoshop 打造溶液字母文字特效 前言 此篇攻略将详细介绍如何利用 Photoshop 实现溶液字母文字特效。通过本篇文章的讲解,您将掌握以下技能: 制作基础文字效果 制作溶液材质效果 制作混合效果,完成溶液字母文字特效 准备工作 在开始制作溶液字母文字特效之前,请确保您已经安装好了最新版的 Photoshop,并准备好以下素材: 背景图片 字母素材…

    C 2023年5月22日
    00
  • C/C++ 中怎样使用SetConsoleTextAttribute()函数来控制输出字符的颜色

    当在控制台程序中使用C/C++语言输出字符时,通过SetConsoleTextAttribute()函数可以改变输出字符的颜色。该函数在Windows头文件中定义。下面给出SetConsoleTextAttribute()函数的用法及示例代码。 语法 BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput, W…

    C 2023年5月23日
    00
  • 终于把淘宝SEO相关概念讲明白了 淘宝常用名词解读

    终于把淘宝SEO相关概念讲明白了 淘宝常用名词解读 什么是淘宝SEO? 淘宝SEO是指通过淘宝搜索引擎优化技术,提升淘宝店铺和商品在淘宝内部搜索结果页的排名,增加店铺和商品的曝光率和销售额的过程。 在实际操作中,淘宝SEO主要包括优化关键词、优化描述、提高转化率等方面。通过细节优化,使得店铺和商品更符合用户搜索习惯和需求。 淘宝常用名词解读 1. 关键词 关…

    C 2023年5月22日
    00
  • C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码攻略 前置知识 在学习C语言字符串快速压缩算法代码之前,需要掌握以下知识: C语言基础知识,包括数据类型、变量、数组、函数等 指针的基本概念和用法 位运算的概念和用法 基本的压缩算法知识 快速压缩算法核心原理 快速压缩算法的核心原理在于用少量的空间存储尽可能多的信息。在字符串压缩中,我们可以利用位运算来压缩数据,将多个字符压缩成一…

    C 2023年5月22日
    00
  • python网络编程学习笔记(九):数据库客户端 DB-API

    关于“python网络编程学习笔记(九):数据库客户端 DB-API”的完整攻略,我做如下分享。 一、DB-API是什么? DB-API全称为Database Application Programming Interface,是Python标准化的数据库编程接口,其定义了一系列必须的对象和数据库操作的方法,可以用来访问各种不同的关系数据库。 在Python…

    C 2023年5月22日
    00
  • 最新ios面试试题以及解决思路分析

    最新iOS面试题以及解决思路分析 背景介绍 作为一名iOS开发工程师,参加技术面试是必不可少的一环。面试过程中往往会面临各种各样的问题,包括技术上的问题、项目中的问题以及软技能方面的考察等。本文将从最新iOS面试题的角度出发,对一些常见的面试题目进行分析,并给出解决问题的思路和具体实现方式,以帮助广大iOS开发工程师成功通过面试。 面试题目 以下是几个最新的…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部