深度搜索,Deep First Search,专门用来解决跟图啊、树啊相关的问题。而,作为一个大三结束的学生,没有一次当课上老师讲解完深搜后,能觉得自己会了。貌似记忆中,讲到深搜的机会不止十次,也不是同一个老师在讲,而每一次,基本上对深搜的讲解都是一样一样的,真不知道这些老师是不是事先“串通”好了。
现在暑假,一次偶然逛jd的时候,看到一本书《啊哈算法》。因为本身算法基础不好,而这本书又是一本入门的书籍,所以就买了下来。第二天,书到手了,稍微翻一下,确实跟买书前看到的评论一样:特别浅,特别适合初学者(好吧,我已经学了三年编程,结果算法我还是个初学,顶!)。
看完之后,对深搜确实理解比较深。书中说到,深搜其实只有三步:
一、边界值或临界值检查,记得return;
二、每一次深搜都要进行的步骤(比如走迷宫,每一次深搜,都要对四个方向进行判断);
三、dfs(next step)和return;
下面贴出一个实例,以供理解
#include <stdio.h>
#include <stdlib.h>
int a[9], book[10], total = 0, n;
void dfs(int step)
{
if (step == n + 1)
{
if (a[0] * 100 + a[1] * 10 + a[2] + a[3] * 100 + a[4] * 10 + a[5] == a[6] * 100 + a[7] * 10 + a[8])
{
total++;
printf("%d + %d = %d\n", (a[0] * 100 + a[1] * 10 + a[2]), (a[3] * 100 + a[4] * 10 + a[5]), (a[6] * 100 + a[7] * 10 + a[8]));
return;
}
}
for (int i = 0; i < 10; i++)
{
if (book[i] == 0)
{
a[step] = i;
book[i] = 1;
dfs(step + 1);
book[i] = 0;
}
}
return;
}
int main()
{
for (int i = 0; i < 10; i++)
{
a[i] = 0;
book[i] = 0;
}
n = 9;
dfs(1);
printf("total=%d\n", total/2);
system("pause");
return 0;
}