深度优先搜索算法(DFS)原理及示例详解

2023-11-10

1 算法原理

事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.

举例说明之:下图是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)->C->F->H->G->D(没有路,最终回溯到A,A也没有未访问的相邻节点,本次搜索结束)。
在这里插入图片描述

2 基本思路

深度优先遍历图的方法是,从图中某顶点v出发:

  • (1)访问顶点v;
  • (2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
  • (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 当然,当人们刚刚掌握深度优先搜索的时候常常用它来走迷宫.事实上我们还有别的方法,那就是广度优先搜索(BFS).

搜索算法简而言之就是穷举所有可能情况并找到合适的答案,所以最基本的问题就是罗列出所有可能的情况。

从根开始计算,到找到位于某个节点的解,回溯法(深度优先搜索)作为最基本的搜索算法,其采用了一种“一只向下走,走不通就掉头”的思想(体会“回溯”二字),相当于采用了先根遍历的方法来构造搜索树。

980.不同路径

题目描述

在二维网格 grid 上,有 4 种类型的方格:

  • 1 表示起始方格。且只有一个起始方格。
  • 2 表示结束方格,且只有一个结束方格。
  • 0 表示我们可以走过的空方格。
  • -1 表示我们无法跨越的障碍。

返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目。

每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。

输入输出示例

输入:
[1,0,0,0],
[0,0,0,0],
[0,0,2,-1]
输出: 2
**解释:**我们有以下两条路径:
(0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
(0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)

直观思路

从起始点开始,朝着起始点的四个方向开始搜索,直到终点停止。

在搜索过程中,需要改变搜索方向,就如同逆时针输出二维数组的元素一样,当到达边界时需要改变方向。在此题中,定义两个方向,一个是改变row方向数组dr = {0, -1, 0, 1},一个是column方向dc = {1, 0, -1, 0}。

代码实现

class Solution980 {
    int ans;
    int[][] grid;
    int tr, tc;
    int[] dr = new int[]{0, -1, 0, 1};
    int[] dc = new int[]{1, 0, -1, 0};
    int R, C;

    public int uniquePathsIII(int[][] grid) {
        this.grid = grid;
        R = grid.length;
        C = grid[0].length;

        int todo = 0;
        int sr = 0, sc = 0;
        for (int r = 0; r < R; ++r) {

        }
       ans = 0;
        dfs(sr, sc, todo);
        return ans;
    }

    public void dfs(int r, int c, int todo) {
        todo--;
        if (todo < 0) return;
        if (r == tr && c == tc) {
            if (todo == 0) ans++;
            return;
        }

        grid[r][c] = 3;
        for (int k = 0; k < 4; ++k) {
            int nr = r + dr[k];
            int nc = c + dc[k];
            if (0 <= nr && nr < R && 0 <= nc && nc < C) {
                if (grid[nr][nc] % 2 == 0)
                    dfs(nr, nc, todo);
            }
        }
        grid[r][c] = 0;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度优先搜索算法(DFS)原理及示例详解 的相关文章

随机推荐

  • ubuntu安装vscode_vscode远程开发配置

    Remote development是一个支持vscode远程开发的插件 非常方便在windows下调试远程linux系统上的代码 使用配置方式如下 首先windows和远端服务器都要安装ssh windows上启用ssh服务即可 linu
  • RBAC权限管理

    RBAC权限管理 RBAC应用最为广泛的权限管理模型 核心的三要素是 用户 角色 权限 但并不仅仅局限于这三个核心要素 基于企业规模 用户规模 运维复杂度 RBCA其实是有很多的变种 从理论角度 有所谓的RBAC0 RBAC1 RBAC2
  • python opencv cv2在图片中画mask掩码/掩膜

    python opencv cv2在图片中画mask掩膜 import cv2 import numpy as np from PIL import Image import matplotlib pyplot as plt mask th
  • 年度最火的AOA蓝牙室内定位原理

    AOA 定位方法 AOA 定位方法 主要是测量信号移动台和基站之间的到达角度 以基站为起点形成的射线必经过移动台 两条射线的交点即为移动台的位置 该方法只需两个基站就可以确定 MS 的估计位置 其定位示意图如图所示
  • 语音转文字,视频转文字的新大陆!--飞书(好用记得点个赞)

    语音转文字 视频转文字的新大陆 飞书 1 选择自己对应的系统 下载飞书 飞书是字节跳动于2016年自研的新一代一站式协作平台 网址 https www feishu cn 2 下载安装之后 使用手机号 邮箱等注册登录 点击会议 点击进入子菜
  • 现代框架背后的概念

    很多初学者问 我应该学哪个框架 和 学一个框架之前需要学多少JS或TS 无数自以为是的文章都在宣传作者首选框架或库的优势 而不是向读者展示其背后的概念以做出明智的决定 那么让我们先解决第二个问题 学一个框架之前要学多少JS TS 尽可能多地
  • python调用c++动态库_使用python 调用 pybind11封装的 cuda C++ 动态链接库

    使用python 调用 pybind11封装的 cuda C 动态链接库 pybind11是可以使C 和python程序间互相调用的轻量头文件库 它可以将C 代码编译成python可调用的动态链接库 pybind11可以自动实现C 中vec
  • SpringMVC总结

    SpringMVC总结 一 配置 1 SpringMVC xml配置文件
  • 三相半控整流电路仿真-- (Matlab仿真1)

    这学期的现控 自控 电力电子技术需要我学学Matlab进行仿真 利用软件仿真本身也是需要我们掌握的很重要的一种技能 我想在学习理论的的过程借助他的帮助来使我更好的理解某些东西 而matlab其功能之强大毋庸置疑 甚至有玩笑说 matlab除
  • Python:使用循环语句for 做一个九九乘法表

    学会了循环语句后 就能做很多小程序了 在这里演示几种九九乘法表的编程方法 首先使用for循环来进行编程 for hang in range 1 10 定义行为hang 行数为9 for lie in range 1 hang 1 定义列为l
  • 反向代理与正向代理之间差异分析

    在网络世界中 爬虫ip是我们常用工具之一 但你是否了解反向爬虫ip和正向爬虫ip之间的区别呢 本文将向你分享反向爬虫ip与正向爬虫ip的差异分析 帮助你更好地选择适合的爬虫ip方式 提升爬虫项目的实际操作价值 首先我们来了解一下 反向爬虫i
  • 干了六年Android开发现在裸辞失业了,再过2个月就30了,该怎么继续生活

    由于这几年公司也在转型 工作经历大概可以分为 3 个阶段 第一阶段是从进公司开始做 android app 开发 无论是外包或者公司的主力产品都做过 第二阶段是做 ROM 开发 由于公司规模不大 除了硬件和底层的东西外 基本上是一个人负责了
  • 事件分发机制

    http www jianshu com p 86e7cd8bc73f View的事件分发 View的事件分发在Android中很重要 很重要 很重要 1 为什么会有事件分发机制 我们知道 android的布局结构是树形结构 这就会导致一些
  • Docker部署Overleaf包含中文字体与全套texlive镜像

    如今Overleaf已推出国内域名访问 速度较之前有很大的提升 但考虑到有些同学为了私密与方便性 因此有了自己搭建开源Overleaf服务的打算 请注意开源项目Overleaf不支持开放注册 需管理员账号来申请注册issue 461 与跟踪
  • CentOS 7.0 服务管理 – systemctl 命令

    最近在本地虚拟机搭建环境 使用service 命名报 service command not found 于是百度了好多都没解决 最后在官网看了下得知 CentOS 7 0中已经没有service命令 而是启用了systemctl服务器命令
  • 【前后缀 + 推公式整理】 Codeforces Round #813 (Div. 2) D. Empty Graph

    题意 给定 n n n 个点的点权 a i a i ai 这 n
  • vue高德地图打点

    vu高德地图打点有两种方式 前言 不管哪种方式 首先肯定是先到高德开放平台申请自己的key 官网链接 高德开放平台 高德地图API amap com 进去先注册 注册完 进入控制台 gt 应用管理 gt 我的应用 创建应用 然后你就有了自己
  • Java随机生成字符串的4种方式

    当您想要生成一个唯一的事务id或作为一个随机临时密码生成器 用户首次在网站上注册或创建防止自动输入的验证码时 通常需要生成随机的字符序列 Java提供了许多不同的方法来编写随机字符串生成器应用程序 下面介绍几种方式 UUID UUID是由一
  • D语言介绍

    D 语言是一种通用的系统和应用编程语言 它是比 C 更高级的语言 同时还保持了生成高效代码以及直接访问操作系统API和硬件的能力 D 很适合于编写从中等规模到那些由团队合作完成 数百万行代码规模的各种程序 D 易于学习 为编程者提供了很多便
  • 深度优先搜索算法(DFS)原理及示例详解

    目录 1 算法原理 2 基本思路 980 不同路径 题目描述 输入输出示例 直观思路 代码实现 1 算法原理 事实上 深度优先搜索属于图算法的一种 英文缩写为DFS即Depth First Search 其过程简要来说是对每一个可能的分支路