DFS

DFS的重点在于递归,是一种利用递归(实际上是用栈来保存未访问的结点,先进后出)实现的搜索算法,直到找到解或走不下去为止。“不撞南墙不回头”

 

int check(参数)

{

  if(满足条件)

    return 1;

  return 0;
}
void dfs(int step)

{

  判断边界(找到解||走不下去了)

  {

    相应操作
  }

  尝试每一种可能

  {

    满足check条件
    标记
    继续下一步dfs(step+1)
    恢复初始状态(回溯时用到)
  }
}

 

1.边界条件的判断

 

2. 当下该如何做

 

3.下一步如何做与现在这一步如何做是一样的

 

DFS常用于找所有解的问题,找到的不一定是最优解

 

思路:

先写参数,肯定得有一或多个参数来表示现在所在得位置,其次你得有走到这儿的代价,比如步数,花费什么的。

然后开始写出口,直接上if干,只要现在所在位置是你要的目标位置就返回结果(一般是代价)。

之后就是下一步怎么走,只要调用下一层DFS就可以了(注意参数的变化),如果下一层DFS有返回值且是一个有效值 就返回这个值。

最后就是应对无解,只需在函数返回一个值代表无解就可以了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第39级台阶

 小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

    站在台阶前,他突然又想着一个问题:

    如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢? 51167078

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 int ans=0; //走法统计
 6 
 7 void dfs(int num,int step) //步数   台阶剩余数
 8 {
 9     if(step<0) //走不下去
10         return;
11     if(step==0&&num%2==0)
12     {
13         ans++;
14         return;
15     }
16     dfs(num+1,step-1);
17     dfs(num+1,step-2);
18 }
19 
20 int main()
21 {
22     dfs(0,39);
23     printf("%d\n",ans);
24     return 0;
25 }
View Code

 

李白打酒

 话说大诗人李白,一生好饮。幸好他从不开车。
    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

    无事街上走,提壶去打酒。
    逢店加一倍,遇花喝一斗。

    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 

    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。  14

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 int ans=0; //方案统计
 6 char s[15];
 7 
 8 void dfs(int a,int b,int jiu,int sum) //店  花  酒  当前走了多少步 
 9 {
10     if(!jiu&&!a&&!b&&s[14]=='b') //出口  !jiu、!a、!b 酒 店 花全部用完等于0 并且最后遇到的是花
11     {
12         ans++;
13         return;
14     }
15     if(a>0) //假设下一步遇到的是店    下一步的其中一种走法
16     {
17         s[sum]='a';  //标记
18         dfs(a-1,b,jiu*2,sum+1); //调用下一层
19     }
20     if(b>0&&jiu>0) //假设下一步遇到的是花 并且还有酒可以喝
21     {
22         s[sum]='b';  //标记
23         dfs(a,b-1,jiu-1,sum+1);  //调用下一层
24     }
25 }
26 
27 int main()
28 {
29     int jiu=2;
30     dfs(5,10,jiu,0);
31     printf("%d\n",ans);
32     return 0;
33 }
View Code

 

posted @ 2019-04-17 11:45  北风吹沙  阅读(515)  评论(0编辑  收藏  举报