zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",ans);
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    How to create jar for Android Library Project
    Very large tabs in eclipse panes on Ubuntu
    64bit Ubuntu, Android AAPT, R.java
    Linux(Ubuntu)下如何安装JDK
    Configure xterm Fonts and Colors for Your Eyeball
    建立、配置和使用Activity——启动其他Activity并返回结果
    建立、配置和使用Activity——使用Bundle在Activity之间交换数据
    建立、配置和使用Activity——启动、关闭Activity
    建立、配置和使用Activity——Activity
    异步任务(AsyncTask)
  • 原文地址:https://www.cnblogs.com/bfcs/p/10722560.html
Copyright © 2011-2022 走看看