**
这是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; // 回溯
}
}
}
}