深度优先搜索算法从简单理解就是把所有可能的情况全部运行一遍,他就犹如一个分叉的树枝。从主干开始逐一经过每一个树枝。从某顶点开始依次访问该顶点相邻顶点。
简单的的深度优先搜索算法需要掌握函数的递归的用法。及我们可以利用函数达到我们的目的。现在看下面这道例题:
话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。请计算所有可能?
#include<stdio.h>
int possiblecount = 0;
void shensou(int count, int dian, int hua);
void possible(int cixu[15]);
int main(void){
shensou(0, 0, 0);
printf("%d", possiblecount);
return 0;
}
void shensou(int count, int dian, int hua){
static int cixu[15];
if(count == 15){
possible(cixu);
}
else{
if(count != 14 && dian != 5){
cixu[count] = 0;
shensou(count + 1, dian + 1, hua);
}
if(hua != 10){
cixu[count] = 1;
shensou(count + 1, dian, hua + 1);
}
}
}
void possible(int cixu[15]){
int i = 0;
int jiu = 2;
for(i = 0; jiu != 0 && i < 15; i++){
if(cixu[i] == 0){
jiu *= 2;
}
else{
jiu --;
}
}
if(jiu == 0 && i == 15){
possiblecount ++;
}
}
这是我们例题的程序,通过之前的分析以及与本题的结合,我们发现最核心的算法就是 程序中的" shensou"函数:
void shensou(int count, int dian, int hua){
static int cixu[15];
if(count == 15){
possible(cixu);
}
if(count != 14 && dian != 5){
cixu[count] = 0;
shensou(count + 1, dian + 1, hua);
}
if(hua != 10){
cixu[count] = 1;
shensou(count + 1, dian, hua + 1);
}
}
}
此函数中运用到了数组,以及递归的思想。从函数上看,第一次所经历的的事件是aaaaabbbbbbbbbb。之后执行程序中函数"possible"的判断。
无论possble函数是否可行,接下来就会进行到第二个情况的运行,及
aaaababbbbbbbbb。aaaabbabbbbbbbb。依次运行,直至所有情况都走完为止。
本题的关键就是对深度优先搜索算法的理解。我把他归结是递归的一种妙用。当然,深度优先搜索算法并非如此简单。这是我根据题目对其进行浅释。