凑算式-蓝桥杯Java-dfs回溯讲解

**

这是2016的年的蓝桥杯真题凑算式,我们理解一下dfs

**

B      DEF

A + --- + ------- = 10

C      GHI

这个算式中AI代表09的数字,不同的字母代表不同的数字。

下面我们用代码解析一下dfs过程

// 凑算式 2016
/**
* 思路过程和数学差不多,把分母乘上来即可
*/
public class Main {
    static int arr[] = new int[10]; // 储存数A - I 分别为多少数字的数组
    static int visit[] = new int[10]; // 用作标记的数组
    static int count = 0;

    public static void main(String[] args) {
        java.util.Scanner sc = new java.util.Scanner(System.in);
        dfs(1); // 从 1 开始填数字,从1填到9
        System.out.println(count);
    }

    /**
     * @param x x是从几开始遍历
     */
    static void dfs(int x) {
        // 递归成立的情况,当1 - 9 填完,递归x = 10 时,开始判断情况
        if (x == 10) {
            int a = arr[1] * arr[3] * (arr[7] * 100 + arr[8] * 10 + arr[9]);
            int b = arr[2] * (arr[7] * 100 + arr[8] * 10 + arr[9]);
            int c = (arr[4] * 100 + arr[5] * 10 + arr[6]) * arr[3];
            if (a + b + c == 10*(arr[7]*100+arr[8]*10+arr[9])*arr[3]){
                // 情况成立解法次数 +1
                count++;
            } else {
                // 情况不成立
                return; // 回溯 
                /*在一种情况穷尽完之后,return完了代码要走递归的下一句也就是 visit[i] = 0,然后回溯到上一种继续往下穷尽,
                一种情况不成立就往上走,dfs实际就是一个大型的树形结构,要便利完所有的情况,
                找出所成立的解法次数,类似于高中数学里面的排列组合,
                比如全排列1234,就是A44,十六种组合全部遍历一遍
                */
            }
        }
        // 要把 1 - 9 的数组全部填进 arr 数组,每个数组的值不能重复
        for (int i = 1; i <= 9; i++) {
            // 给每一个数组的下标进行标记1
            if (visit[i] == 0){
                visit[i] = 1;
                arr[x] = i;
                dfs(x + 1); // 每次x + 1
                // 回溯完了标记清零
                visit[i] = 0; // 回溯
            }
        }
    }
}

你可能感兴趣的:(java,蓝桥杯,开发语言,后端)