最短时间学会基于C++实现DFS深度优先搜索

最短时间学会基于C++实现DFS深度优先搜索攻略

什么是DFS深度优先搜索

DFS即深度优先搜索,是一种基于搜索算法的遍历和检索树或图数据结构的算法。DFS算法采用深度优先策略,从根结点出发访问所有可达结点,直到叶子节点。在访问某个结点时,先访问该结点的第一个未访问的相邻节点,然后递归的访问其非相邻节点。其搜索的核心思想是根据某个搜索方向向前搜索到底,直至无法继续下去时就回到上一个结点重新选择另一片区域搜索,直至所有结点都被访问。

实现DFS深度优先搜索

方式一:递归实现DFS深度优先搜索

递归实现DFS深度优先搜索比较简单,只需要实现以下三个步骤:

  1. 判断当前节点是否已经被访问过,如果访问过,返回。
  2. 将当前节点标记为已访问。
  3. 对当前节点的所有未被访问过的临界节点进行访问,递归重复以上步骤。
void dfs(int cur, vector<vector<int>>& graph, vector<bool>& visited) {
    visited[cur] = true;
    for (int i = 0; i < graph[cur].size(); i++) {
        int neighbor = graph[cur][i];
        if (!visited[neighbor]) {
            dfs(neighbor, graph, visited);
        }
    }
}

方式二:栈实现DFS深度优先搜索

使用栈来实现DFS深度优先搜索的方法,具备更好的可读性和可维护性。由于需要遍历到所有未访问的节点,因此不能直接用栈进行遍历,需要将根节点压入栈内,然后使用while循环进行遍历,直到栈为空。

void dfs(int start, vector<vector<int>>& graph, vector<bool>& visited) {
    stack<int> s;
    s.push(start);
    while (!s.empty()) {
        int cur = s.top();
        s.pop();
        if (visited[cur]) continue;
        visited[cur] = true;
        for (int i = graph[cur].size() - 1; i >= 0; i--) {
            int neighbor = graph[cur][i];
            if (!visited[neighbor]) {
                s.push(neighbor);
            }
        }
    }
}

示例1:图的遍历

例如,我们要遍历一个图,对该图进行DFS深度优先搜索,可以使用以下代码:

int main() {
    vector<vector<int>> graph(5);
    graph[0].push_back(1);
    graph[1].push_back(2);
    graph[2].push_back(3);
    graph[3].push_back(4);
    graph[4].push_back(1);

    vector<bool> visited(5, false);
    dfs(0, graph, visited);

    return 0;
}

以上代码中,我们以图中的0号节点为起始节点,进行深度优先遍历。

示例2:迷宫的搜索

以下代码提供一个方格迷宫搜索的示例,使用DFS深度优先搜索解决,其中,我们使用了递归。

int maze[5][5] = {
    { 0, 0, 0, 0, 1 },
    { 0, 1, 0, 1, 0 },
    { 0, 0, 0, 1, 0 },
    { 1, 1, 0, 0, 0 },
    { 0, 0, 1, 0, 0 }
};

bool visited[5][5];
int dstX = 4, dstY = 4;

bool dfs(int curX, int curY) {
    if (curX < 0 || curY < 0 || curX >= 5 || curY >= 5 || visited[curX][curY] || maze[curX][curY] == 1) {
        return false;
    }
    if (curX == dstX && curY == dstY) {
        return true;
    }
    visited[curX][curY] = true;
    if (dfs(curX-1, curY) || dfs(curX+1, curY) || dfs(curX, curY-1) || dfs(curX, curY+1)) {
        return true;
    }
    visited[curX][curY] = false;
    return false;
}

总结

以上是两种实现DFS深度优先搜索的方法及其示例解决方案。简单的递归实现可以快速实现,但是在处理效率相对较低的情况下会出现栈空间不足的问题,此时栈毕竟是有限大小的,如果栈深度过大会导致程序崩溃。栈实现的方法则可以避免这个问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:最短时间学会基于C++实现DFS深度优先搜索 - Python技术站

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

相关文章

  • C语言实现中国象棋

    题目:C语言实现中国象棋 这是一个将中国象棋的游戏规则用C语言实现的项目。下面是实现该项目的完整攻略: 1. 确定需要的数据结构 在编写代码之前,需要确定需要的数据结构。对于中国象棋,我们可以使用以下数据结构: 棋子(soldier): 数字编号 棋子颜色(红色或黑色) 棋子类型(如马、象、帅等) 棋子当前所在位置 棋子是否被吃掉 棋盘(board): 二维…

    C 2023年5月23日
    00
  • C语言中const,volatile,restrict的用法总结

    《C语言中const,volatile,restrict的用法总结》 const关键字 const关键字被用于限定一个变量的值不可被修改。它可以作为函数返回类型、形参类型、函数的局部变量类型以及全局变量类型来使用。 const修饰指针类型 使用const修饰指针类型可以实现对指针所指对象的只读访问,而不是实现对指针本身的只读访问。语法格式如下: const …

    C 2023年5月22日
    00
  • C++实现Dijkstra(迪杰斯特拉)算法

    下面我将为你讲解如何使用C++实现Dijkstra(迪杰斯特拉)算法。 Dijkstra算法简介 Dijkstra算法是解决单源最短路径问题的一种贪心算法。Dijkstra算法最初是由荷兰的计算机科学家Edsger W. Dijkstra于1956年提出的。该算法的思路是从起点开始,依次访问每个相邻节点,确定从起点到该节点的最短路径,并将该节点标记为已访问。…

    C 2023年5月22日
    00
  • boost字符串处理函数format的用法

    Title: 解读boost库的字符串处理函数format用法 介绍 Boost库中的format函数可以将多个参数填充到一个格式字符串中,实现按照指定的格式输出文本的功能。本文将介绍format函数的基本用法,并通过两个示例详细阐述其实际应用。 基本用法 format函数本质上是一个类似于printf函数的格式化输出函数,其主要作用是将一系列变量填充到指定…

    C 2023年5月23日
    00
  • C语言编程入门之程序头文件的简要解析

    C语言编程入门之程序头文件的简要解析 什么是头文件 头文件(Header Files)通常是一些包含函数定义、变量声明等的文本文件,其内容可以被多个源文件引用(#include)以便让其内部定义的函数和变量可以在引用这个头文件的源文件中被使用。 头文件的分类 头文件可以分为两类: 1. 系统头文件 系统头文件是由编译器提供的,主要包含一些常用的函数库、数据类…

    C 2023年5月23日
    00
  • golang生成JSON以及解析JSON

    生成JSON: 在golang中生成JSON非常简单,可以使用标准库中的encoding/json包来实现。下面是一个示例代码: package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name…

    C 2023年5月23日
    00
  • word文档中怎么插入公式? word插入公式的两种方法

    当我们需要在 Word 文档中插入公式时,可以通过以下两种方法: 方法一:使用公式编辑器 首先,选择想要插入公式的位置,然后点击 Word 菜单中的 “插入” 标签; 在 “插入” 标签下,选择 “公式” 选项卡; 点击 “公式” 选项卡下的 “新建公式” 按钮,将弹出公式编辑器窗口; 在公式编辑器窗口中,在上下两栏之间输入公式并编辑; 单击 “确定” 按钮…

    C 2023年5月22日
    00
  • C语言与Lua之间的相互调用详解

    关于“C语言与Lua之间的相互调用详解”的完整攻略,我建议从以下几个方面进行详细讲解: 引言 介绍C语言与Lua的相关背景信息,对二者的区别和联系进行简要说明,概括C语言与Lua之间的相互调用的基本流程和原理。 C语言与Lua之间的调用 首先讲解C语言调用Lua函数的流程,主要包括: 编写Lua脚本文件; C语言调用Lua脚本文件中的函数; C语言向Lua传…

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