一、题目
凑算式
B DEF
A + --- + ------- = 10
C GHI
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。(比赛时,题目有改动)
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
二、分析
A~I代表1~9的数字,那么就是每个数字都有可能,但是题目中说不同的字母代表不同的数字,所以这9个数字是不同的,用深度优先遍历的方法找到不同的数字组合。
1.定义一个数组来存1~9的数字,2.编写深度优先算法
package lan2016;public class C凑算式4 {public static void main(String[] args) {dfs(0);//深度优先算法,表示从根节点开始遍历System.out.println(count);}public static int count = 0;public static double[] arr = {1,2,3,4,5,6,7,8,9};public static void dfs(int m) {if(m >= 9) {//只有当m大于等于9的时候,表示已找到9数字double a = arr[0];double b = arr[1];double c = arr[2];double d = arr[3] * 100 + arr[4] * 10 + arr[5];double e = arr[6] * 100 + arr[7] * 10 + arr[8];if(a*c*e + b*e + c*d == 10*c*e) {count++;}}for(int i = m; i < 9; i++) {//尝试数组的索引从m到8swap(m,i);dfs(m+1);swap(m,i);}}public static void swap(int i, int j) {double temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}
运行结果:29
用了递归和回溯的思想