DFS之连通性模型——AcWing 1112. 迷宫

DFS之连通性模型

定义

DFS(深度优先搜索,Depth-First Search)之连通性模型主要用于图论问题中判断图的连通性,即确定图中的所有节点是否可以通过边相互到达。

DFS(深度优先搜索,Depth-First Search)之连通性模型主要用于图论问题中判断图的连通性,即确定图中的所有节点是否可以通过边相互到达。

运用情况

  1. 判断图的连通性:检查一个无向图是否为连通图,只需从任一节点开始执行DFS,若能访问到所有节点,则图是连通的。
  2. 强连通分量:在有向图中,寻找所有强连通分量(即每个节点都可以到达其他所有节点的子图)。
  3. 迷宫问题:判断从起点到终点是否有路径,以及找出一条路径。
  4. 岛屿数量:在二维网格图中,计算由1(表示陆地)构成的“岛屿”数量。
  5. 社交网络分析:分析用户间的关系网,判断是否属于同一社交圈等。

注意事项

  1. 避免循环:需要标记已访问的节点,防止陷入无限循环。
  2. 起始节点选择:如果图可能不连通,需从每个未访问的节点开始执行DFS,以检测所有连通分量。
  3. 栈溢出:深度极大的图可能导致递归栈溢出,可考虑使用迭代方式或手动管理栈来避免。
  4. 性能考虑:对于大规模图,DFS可能不是最优选择,尤其是需要频繁遍历多个节点的情况。

解题思路

  1. 初始化:标记所有节点为未访问。
  2. 选择起始节点:通常从一个节点开始,但若考虑全图连通性,需对每个未访问节点执行DFS。
  3. DFS过程:访问当前节点,将其标记为已访问。遍历当前节点的所有邻居,对于每个未访问的邻居,递归执行DFS。在递归返回后,继续探索当前节点的下一个未访问邻居,直到所有邻居都被访问。
  4. 结果判断:如果从初始节点能够访问所有节点,图是连通的。若进行多轮DFS以探索不同连通分量,最终连通分量的数量可揭示图的整体连通性。

AcWing 1112. 迷宫

题目描述

AcWing 1112. 迷宫 - AcWing

运行代码

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct Point {
    int x;
    int y;
};

bool bfs(vector<vector<char>> &maze, Point start, Point end) {
    int n = maze.size();
    vector<vector<bool>> visited(n, vector<bool>(n, false));
    queue<Point> q;
    q.push(start);
    visited[start.x][start.y] = true;

    int dx[] = {-1, 1, 0, 0};
    int dy[] = {0, 0, -1, 1};

    while (!q.empty()) {
        Point curr = q.front();
        q.pop();

        if (curr.x == end.x && curr.y == end.y) {
            return true;
        }

        for (int i = 0; i < 4; i++) {
            int newX = curr.x + dx[i];
            int newY = curr.y + dy[i];

            if (newX >= 0 && newX < n && newY >= 0 && newY < n && maze[newX][newY] == '.' &&!visited[newX][newY]) {
                visited[newX][newY] = true;
                Point next = {newX, newY};
                q.push(next);
            }
        }
    }

    return false;
}

int main() {
    int k;
    cin >> k;

    while (k--) {
        int n;
        cin >> n;

        vector<vector<char>> maze(n, vector<char>(n));

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> maze[i][j];
            }
        }

        Point start, end;
        cin >> start.x >> start.y >> end.x >> end.y;

        if (maze[start.x][start.y] == '#' || maze[end.x][end.y] == '#') {
            cout << "NO" << endl;
            continue;
        }

        if (bfs(maze, start, end)) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }

    return 0;
}

代码思路

  • 定义了一个Point结构体来表示坐标点。
  • bfs函数用于进行广度优先搜索。
    • 创建一个与迷宫大小相同的visited数组来标记已访问的点。
    • 使用一个队列来存储待访问的点。
    • 定义了四个方向的偏移量。
    • 从起始点开始,将其入队并标记为已访问。
    • 只要队列不为空,取出队头元素,检查是否到达终点。如果未到达,则向四个方向扩展,将可通行且未访问的点入队并标记。
  • main函数中:
    • 输入测试数据的组数。
    • 对于每组数据,输入迷宫信息、起始点和终点。
    • 如果起始点或终点不可通行,直接输出"NO"。
    • 否则调用bfs函数进行搜索,根据结果输出"YES"或"NO"。

改进思路

  1. 数据输入和错误处理:可以添加更多的输入错误处理,例如检查输入的行和列坐标是否在合法范围内,以及输入的迷宫字符是否只有 . 和 # 。

  2. 空间优化:对于 visited 数组,可以使用位运算或者更紧凑的数据结构来减少空间占用,特别是当 n 较大时。

  3. 性能优化:在扩展新节点时,可以先判断新节点是否在迷宫范围内,避免不必要的数组越界检查。考虑使用双端队列(deque)代替队列,在某些情况下可能会提高性能。

  4. 代码可读性和可维护性:为关键的代码段添加更详细的注释,以提高代码的可理解性。将一些复杂的逻辑提取为单独的函数,使代码结构更清晰。

  5. 功能扩展:可以添加输出最短路径的功能,如果需要的话。

  6. 算法优化:考虑使用 A* 算法等更高效的寻路算法,可能会在某些情况下更快地找到路径。

其它代码

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;

int n;
char g[N][N];
int xa, ya, xb, yb;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
bool st[N][N];
bool dfs(int x, int y)
{
    if (g[x][y] == '#') return false;
    if (x == xb && y == yb) return true;
    st[x][y] = true;
    for (int i = 0; i < 4; i ++ )
    {
        int a = x + dx[i], b = y + dy[i];
        if (a < 0 || a >= n || b < 0 || b >= n) continue;
        if (st[a][b]) continue;
        if (dfs(a, b)) return true;
    }
    return false;
}
int main()
{
    int t;
    cin >> t;
    while(t -- )
    {
        memset(st, 0, sizeof st);
        cin >> n;
        for(int i = 0; i < n; i ++ ) cin >> g[i];
        cin >> xa >> ya >> xb >> yb;
        int t = dfs(xa, ya);
        if(t) puts("YES");
        else puts("NO");
    }
}

代码思路

  1. 定义了一些常量和变量,包括迷宫的大小 n,迷宫的字符数组 g,起点和终点的坐标 xa, ya, xb, yb,以及方向偏移数组 dx 和 dy,还有标记是否访问过的二维数组 st
  2. dfs 函数用于深度优先搜索来判断是否存在从起点到终点的路径。
    • 如果当前位置是 #,则返回 false
    • 如果当前位置就是终点,返回 true
    • 标记当前位置已访问。
    • 遍历四个方向,如果新位置合法且未访问,递归调用 dfs 函数,如果返回 true 则直接返回 true
  3. 在 main 函数中:
    • 首先读入测试数据的组数 t 。
    • 对于每组数据,先清空访问标记,读入迷宫信息和起点终点坐标。
    • 调用 dfs 函数进行搜索,根据结果输出 YES 或 NO 。

改进思路

  1. 数据输入和错误处理:增加对输入数据的合法性检查,例如确保输入的坐标在合法范围内,输入的迷宫字符只有 . 和 # 。
  2. 性能优化:可以考虑使用剪枝策略来减少不必要的搜索。例如,如果当前位置到终点的曼哈顿距离大于已经搜索的深度,就可以提前返回。
  3. 代码结构和可读性:为关键代码添加更多注释,提高代码的可理解性。将深度优先搜索的部分提取为一个单独的函数,使 main 函数更加简洁清晰。
  4. 搜索算法选择:对于较大规模的迷宫,可以考虑使用广度优先搜索(BFS),因为 BFS 能保证找到的是最短路径,并且在某些情况下可能比 DFS 更快找到可行解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习——深度学习中感受野的计算

感受野 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;感受野&#xff08;Receptive Field&#xff09; 是一个非常重要的概念。它描述了网络中某一层的输出&#xff08;通常是特征图上的一个像素点&#xff09;所对应的输入图像上的空间范围。这个范围代表了该输出…

Jelly Merge | Template + Editor(休闲益智游戏包)

Jelly Merge是Watermelon Games开发的一款完整游戏。 这款完全可定制的益智游戏具有简单但超级有趣的游戏玩法。 您下一次成功的完美起点&#xff01; 我们的优势 &#x1f9d1;&#x1f3fb;‍&#x1f4bb; 不和谐支持 &#x1f5c3;️ 详细文档 &#x1f6e0;️易于使用的工…

C# WPF 3D 数据孪生 系列六

数字孪生应用开发 应用开发中的布局需求 Grid基本使用 WPF 3D绘图 点云 系列五-CSDN博客 WPF UI 3D 多轴 机械臂 stl 模型UI交互-CSDN博客 WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三-CSDN博客 数字孪生 介…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

本地Windows电脑 连接 Windows 服务器

Windows电脑 连接 Windows 服务器 方式1&#xff1a;直接搜索 在电脑的搜索栏&#xff0c;输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”&#xff0c;打开 远程桌面连接 方式2&#xff1a;运行框打开服务器连接 同时按&#xff1a;Windows徽标键…

【BUUCTF-PWN】10-bjdctf_2020_babystack

简单的栈溢出&#xff0c;ret2text 64位&#xff0c;开启了NX保护 执行效果&#xff1a; main函数&#xff1a; 因为读入的字符长度可以由用户输入的第一个参数值决定&#xff0c;因此read函数存在栈溢出 覆盖距离为0x108 存在后门函数&#xff1a; 后门函数地址0x4…

Vulnhub靶场DC-5练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 利用burpsuite爆破文件包含的参数2. 文件包含3. nginx日志挂马4. 反弹shell5.漏洞利用和提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 介绍&#xff1a; …

(十三)MipMap

MipMap概念 滤波 采样 mipmap级别判定 问题&#xff1a;opengl如何判定应该使用下一级的mipmap呢&#xff1f; 通过glsl中的求偏导函数计算变化量决定 手动实现mipmap原理 1、生成mipmap的各个级别 2、修改vertexShader使得三角形随着时间变小 **** 需要更改Filter才能…

《昇思25天学习打卡营第8天|模型训练》

文章目录 今日所学&#xff1a;一、构建数据集二、定义神经网络模型三、了解超参、损失函数和优化器1. 超参2. 损失函数3. 优化器 四、训练与评估总结 今日所学&#xff1a; 在今天这一节我主要学习了模型的训练&#xff0c;知道了模型训练一般分为四个步骤&#xff1a; 构建…

[C++]——同步异步日志系统(2)

同步异步日志系统 一、 不定参函数1.1 不定参宏函数的使用1.2 C 语言中不定参函数的使用1.3 C不定参数使用 二、设计模式2.1 单列模式2.2 工厂模式2.3 建造者模式2.4 代理模式 在我们开发同步异步日志系统之前&#xff0c;需要了解一些相关的技术知识。 一、 不定参函数 在初学…

华为OD机试 - 考古学家 - 递归(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

p6spy 组件打印完整的 SQL 语句、执行耗时

一、前言 我们来配置一下 Mybatis Plus 打印 SQL 功能&#xff08;包括执行耗时&#xff09;&#xff0c;一方面可以了解到每个操作都具体执行的什么 SQL 语句&#xff0c; 另一方面通过打印执行耗时&#xff0c;也可以提前发现一些慢 SQL&#xff0c;提前做好优化&#xff0c…

西门子继裁员4100人计划后,巨资开启万人招聘!46万员工再增员……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 近年来&#xff0c;西门子在全球范围内继续扩大其业务规模。…

leetcode--二叉树中的最长交错路径

leetcode地址&#xff1a;二叉树中的最长交错路径 给你一棵以 root 为根的二叉树&#xff0c;二叉树中的交错路径定义如下&#xff1a; 选择二叉树中 任意 节点和一个方向&#xff08;左或者右&#xff09;。 如果前进方向为右&#xff0c;那么移动到当前节点的的右子节点&…

《vue3》reactivity API(vue3的$set呢?)

在Vue2中&#xff0c;修改某一些数据&#xff0c;视图是不能及时重新渲染的。 比如数组 <div> {{ myHobbies }} </div>data: () > ({myHobbies: [篮球, 羽毛球, 桌球] }); mounted () {this.myHobbies[1] sing; // 视图层并没有改变 }因此&#xff0c;Vue2就提…

实验2 字符及字符串输入输出与分支程序设计实验

字符及字符串输入输出 从键盘输入两个一位十进制数&#xff0c;计算这两个数之和&#xff0c;并将结果在屏幕上显示出来。 分支程序设计 从键盘输入一字符&#xff0c;判断该字符是小写字母、大写字母、数字或者其他字符。若输入为小写字母&#xff0c;显示“You Input a Lo…

无忧易售功能:刊登页面文本翻译,无缝对接全球买家

每一个词语&#xff0c;每一句话&#xff0c;都承载着产品的灵魂和品牌的故事&#xff0c;无忧易售的刊登页面文本翻译服务&#xff0c;一键操作即可将你的产品介绍、详情或广告文案转化为多语言版本&#xff0c;轻松管理&#xff0c;高效发布。 一、Allegro、OZON、Coupang、…

手动将dingtalk-sdk-java jar包打入maven本地仓库

有时候,中央镜像库不一定有自己需要的jar包,这时候我们就需要用到该方法,将jar打入maven本地仓库,然后项目中,正常使用maven的引入规则。 mvn install:install-file -Dmaven.repo.local=D:\software\maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\repo -DgroupId=ding…

高德地图轨迹回放并提示具体信息

先上效果图 到达某地点后显示提示语&#xff1a;比如&#xff1a;12&#xff1a;56分驶入康庄大道、左转驶入xx大道等 <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"…

Datawhale AI夏令营2024 Task3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 #AI夏令营 #Datawhale #夏令营 一、数据集制作1.1 环境配置1.2 数据处理prompt1.3 训练数据集制作1.4 测试集数据制作 二、模型微调2.1 平台微调2.2 平台微调 三、微调推理提…