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
  • 相关阅读:
    Jisa's Notebook
    前端常见跨域解决方案
    串口
    logging的使用
    Hexo
    优美的二维树状数组
    数据结构之树的基本概念
    js 监听ios手机键盘弹起和收起的事件
    jquery.qrcode.js生成二维码(前端生成二维码)
    js产生一个随机的字符串数字组合
  • 原文地址:https://www.cnblogs.com/bfcs/p/10722560.html
Copyright © 2011-2022 走看看