蓝桥杯: 凑算式+寒假作业+ 方格填数+搭积木 dfs算法

 

蓝桥杯: 凑算式+寒假作业+ 方格填数+搭积木

这几题都使用了dfs深搜算法,dfs蓝桥杯很多题都可以都可以用到.

一定要掌握!
凑算式

     B      DEF
A + --- + ------- = 10
     C      GHI
     
(如果显示有问题,可以参见【图1.jpg】)
     
     
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
 

凑算式

答案 : 29

public class Main {

    static boolean b[] = new boolean[10]; //声明布尔数组代表该数字是否被访问过
    static int count = 0;
    static int[] nums = new int[10]; //存1-9

    public static void main(String[] args) {
        fun(1);
        System.out.println(count);
    }
    // 获得1-9全排列
    public static void fun(int m) {

        if (m == 10) {
            if (check()) {
                count++;
            }
        }
        for (int i = 1; i <= 9; i++) {
            if (b[i] == false) {
                b[i] = true;
                nums[m] = i;
                fun(m + 1);
                b[i] = false;
            }
        }
    }
    // 判断是否满足凑算式
    public static boolean check() {
        double q = nums[1];
        double w = nums[2] * 1.00 / nums[3];
        double e = (nums[4] * 100 + nums[5] * 10 + nums[6]) * 1.00 / (nums[7] * 100 + nums[8] * 10 + nums[9]);
        if (q + w + e == 10.00) return true;
        else return false;
    }
}

现在小学的数学题目也不是那么好玩的。
 看看这个寒假作业:
 □ + □ = □
 □ - □ = □
 □ × □ = □
 □ ÷ □ = □
 每个方块代表1~13中的某一个数字,但不能重复。

 比如:
 6 + 7 = 13
 9 - 8 = 1
 3 * 4 = 12

 10 / 2 = 5

 以及:
 7 + 6 = 13
 9 - 8 = 1
 3 * 4 = 12
 10 / 2 = 5
 就算两种解法。(加法,乘法交换律后算不同的方案)
 你一共找到了多少种方案?

 请填写表示方案数目的整数。
 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


public class Main{

    static boolean[] b = new boolean[15];
    static int count = 0;
    static int[] a = new int[15];

    public static void main(String[] args) {
        f(1);
        System.out.println(count);
    }

    public static void f(int m) {
        if (m == 14) {

            if (a[10] == a[11] * a[12]) {
                count++;
            }
            return;
        }
        if (m == 11) {
            if (a[7] * a[8] != a[9]) return;
        }
        if (m == 8) {
            if (a[4] - a[5] != a[6]) return;
        }
        if (m == 5) {
            if (a[1] + a[2] != a[3]) return;
        }
        for (int i = 1; i <= 13; i++) {
            if (!b[i]) {
                b[i] = true;
                a[m] = i;
                f(m + 1);
                b[i] = false;
            }
        }
    }


    public static boolean check() {

        if (a[0] + a[1] == a[2] &&
                a[3] - a[4] == a[5] &&
                a[6] * a[7] == a[8] &&
                a[9] / a[10] == a[11]
        ) return true;
        return false;
    }
}


方格填数

如下的10个格子

 

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


public class Main {

    static boolean b[] = new boolean[10];
    static int count = 0;
    static int[] nums = new int[10];

    public static void main(String[] args) {
        f(0);
        System.out.println(count);
    }

    private static void f(int m) {
        if (m == 10) {

            if (check()) {
                String s = "";
                for (int i = 0; i < 10; i++) {
                    s += nums[i];
                }
                System.out.println(s);
                count++;
            }
        }
        for (int i = 0; i < 10; i++) {
            if (!b[i]) {
                b[i] = true;
                nums[m] = i;
                f(m + 1);
                b[i] = false;
            }
        }
    }

    private static boolean check() {
        if (nums[0] == nums[1] + 1 ||
                nums[1] == nums[2] + 1 ||
                nums[3] == nums[4] + 1 ||
                nums[4] == nums[5] + 1 ||
                nums[5] == nums[6] + 1 ||
                nums[7] == nums[8] + 1 ||
                nums[8] == nums[9] + 1
        ) return false;

        if (nums[0] == nums[4] + 1 ||
                nums[1] == nums[5] + 1 ||
                nums[3] == nums[7] + 1 ||
                nums[4] == nums[8] + 1 ||
                nums[5] == nums[9] + 1 ||
                nums[2] == nums[6] + 1
        ) return false;

        if (nums[0] == nums[5] + 1 ||
                nums[0] == nums[3] + 1 ||
                nums[1] == nums[6] + 1 ||
                nums[1] == nums[4] + 1 ||
                nums[2] == nums[5] + 1 ||
                nums[3] == nums[8] + 1 ||
                nums[4] == nums[7] + 1 ||
                nums[4] == nums[9] + 1 ||
                nums[5] == nums[8] + 1 ||
                nums[6] == nums[9] + 1
        ) return false;

        if (nums[0] == nums[1] - 1 ||
                nums[1] == nums[2] - 1 ||
                nums[3] == nums[4] - 1 ||
                nums[4] == nums[5] - 1 ||
                nums[5] == nums[6] - 1 ||
                nums[7] == nums[8] - 1 ||
                nums[8] == nums[9] - 1
        ) return false;

        if (nums[0] == nums[4] - 1 ||
                nums[1] == nums[5] - 1 ||
                nums[3] == nums[7] - 1 ||
                nums[4] == nums[8] - 1 ||
                nums[5] == nums[9] - 1 ||
                nums[2] == nums[6] - 1
        ) return false;

        if (nums[0] == nums[5] - 1 ||
                nums[0] == nums[3] - 1 ||
                nums[1] == nums[6] - 1 ||
                nums[1] == nums[4] - 1 ||
                nums[2] == nums[5] - 1 ||
                nums[3] == nums[8] - 1 ||
                nums[4] == nums[7] - 1 ||
                nums[4] == nums[9] - 1 ||
                nums[5] == nums[8] - 1 ||
                nums[6] == nums[9] - 1
        ) return false;

        return true;
    }


}


搭积木

小明最近喜欢搭数字积木,
一共有10块积木,每个积木上有一个数字,0~9。

搭积木规则:
每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。
最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

   0
  1 2
 3 4 5
6 7 8 9

   0
  3 1
 7 5 2
9 8 6 4    

请你计算这样的搭法一共有多少种?

请填表示总数目的数字。


public class Main {

    static boolean b[] = new boolean[10];
    static int[] nums = new int[10];
    static int count = 0;

    public static void main(String[] args) {
        fun(0);
        System.out.println(count);
    }

    public static void fun(int m) {
        if (m == 10) {
            if (check()) {
                count++;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            if (b[i] == false) {
                b[i] = true;
                nums[m] = i;
                fun(m + 1);
                b[i] = false;
            }
        }
    }


    public static boolean check() {

        if (nums[0] < nums[1] &&
                nums[0] < nums[2] &&
                nums[1] < nums[3] &&
                nums[1] < nums[4] &&
                nums[2] < nums[4] &&
                nums[2] < nums[5] &&
                nums[3] < nums[6] &&
                nums[3] < nums[7] &&
                nums[4] < nums[7] &&
                nums[4] < nums[8] &&
                nums[5] < nums[8] &&
                nums[5] < nums[9]) {
            return true;
        }
        return false;

    }



}


注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

  


猜你喜欢

转载自blog.csdn.net/weixin_42236404/article/details/84666935