Some Notes

Be HardWorking Every Day.

JoyWonderful
48 文章
3 分类
22 标签

深度优先搜索

前置知识:图论

引用广为人知的一句话:

图论 (Graph Theory) 是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

像深度优先搜索,其实也要用到“图”这个概念。其实,“图”体现了搜索(递归)的过程,计算机中的“图”有很多使用的场景。

概述

深度优先搜索(深搜),英文名 Depth First Search,简称 DFS。即从初始节点出发,按一定顺序不断地向下一节点扩展,达到条件则返回上一个节点,以此类推。这正是一个递归的过程。叫深搜是因为它递归的过程若形象来看是不断“加深”的,这样一搜到底也是递归的特性。

测试全部渲染

个人意见:如何写出漂亮的代码

创作说明:

此文章仅为个人看法。您写代码的习惯可以依据您的个人喜好。此文章只是一些个人的建议。
您在 OI 竞赛中,您完全可以不去注意代码风格。
此文章的建议主要用于工程代码中。

代码的维护还是很重要的。相信谁也不愿意去维护连自己都看得头晕的代码。在这里,我想给出一些个人建议,让代码的可读性强一些。大部分代码以 C++ 为例。这篇文章其实也是给自己看的。

递归

写递归的要点
明白一个函数的作用并相信它能完成这个任务,千万不要跳进这个函数里面企图探究更多细节, 否则就会陷入无穷的细节无法自拔,人脑能压几个栈啊。
—— OI-wiki

递归,就是一个函数自身调用自身。递归起到类似与循环的效果。但是,与循环不同,递归可以分支。如果循环一定是一条直线,那么递归可能是树形结构。

循环 -> 递归

前面说了,循环和递归很像。那么,我们可以将 for 循环尝试转为递归。先来一个循环的示例:

for(int i = 1; i <= n; i++)
{
    printf("qwq, %d\n", n);
}

首先,让我们来想一想,for 循环的括号中 3 个语句分别是干什么的呢?

  1. int i = 1; 这是循环的初始化,定义了一个变量 $i$,将其赋值为 $1$。
  2. i <= n; 这是循环每次进行下去的条件,当 $i>n$ 时即退出循环。
  3. i++ 这是循环每次结束后干的事,当执行完循环体时, $i$ 则加 $1$。

这样回忆下来,可以发现,在 for 循环的括号中 3 个语句其实可以拆分出来。

C++ 数据范围

这就是一个随记,方便自己用的。