DFS深度优先搜索

1457972626

不得不说的暴力的dfs深度搜索法,临时抱佛脚,过几天是蓝桥杯省赛,花一两天时间练习dfs

题目不求多练,主要是靠理解。

废话不说,列几道刚水过的题
题目描述

标题:李白打酒

话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

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

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

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

题目一览而过,最直接的就是dfs
代码实现

public class LiBaiHeJiu {

private static int count = 0;

static char[] s = new char[20];

static int f(int d, int h, int j) {
    if (d > 0)
        f(d - 1, h, j * 2);
    if (h > 0)
        f(d, h - 1, j - 1);
    if (d == 0 && h == 1 && j == 1)
        count++;
    return count;
}

static void m(int d, int h, int j) {
    if (d < 0 || h < 0 || j < 0)
        return;
    if (d == 0 && h == 1 && j == 1) {
        System.out.println(s.toString());
        count++;
    }
    s[d + h - 1] = 'a';
    f(d - 1, h, j * 2);
    s[d + h - 1] = 'b';
    f(d, h - 1, j - 1);
}

public static void main(String agrs[]) {
    m(5, 10, 2);
    System.out.println(count);
}

}

题目描述

题目标题: 第39级台阶
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。

要求提交的是一个整数。
注意:不要提交解答过程,或其它的辅助说明文字。
题目思路

一看题目可以选择递归,可以使用dfs,下面是使用dfs解法
代码实现

/**

  • 39级阶梯问题

  • @author Ape

  • /
    public class JT {

    static int count = 0;

    static void w(int n, int step) {

    if (n < 0)
        return;
    if (n == 0 && step % 2 == 0) {
        count++;
        return;
    }
    w(n - 1, step + 1);
    w(n - 2, step + 1);

    }

    public static void main(String agrs[]) {

    w(39, 0);
    System.out.println(count);

    }
    }