凑算式
B DEF
A + --- + ------- = 10
C GHI
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
B DEF
A + --- + ------- = 10
C GHI
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
看到这种题第一个想法就是暴力破解,但是深挖一下,发现用到的是我平时很少接触到的回溯法,之前解八皇后问题时用过,但是当时做完思路也不是很清晰,今晚翻出来看看,再参考一下别人的做法。做出了这一题。
理清一下思路:
1.DEF和GHI是一个数,而不是相乘的。并且要考虑相乘之后精度的问题。
2.保证每一个数只出现一次
class HuiSu{
static boolean []status = new boolean[10];//判断1~9这几个数值有没有被用了,初始值是false;
static int []store = new int[10];//存放数字1~9。为了计算方便,从角标1开始,到角标9结束。就创建一个大小为10的数组。
static int count = 0;
public static void main(String []args){
backTrack(1);
System.out.println(count);
}
public static void backTrack(int num){//num的值就是对应ABCDEFGHI的位置嘛,num=1时就是代表A位置,num=2代表B位置,以此类推
if( num == 10)//当到num==10时,说明到达最后了,每一个数都用上了,可以进行凑算式判断了
if(check())
count++;
for(int i=1;i<=9;i++){//从1开始循环赋值,下面会判断此数有没有用过。
if(status[i] == false){
status[i] = true;//当进入这里后,这个值的状态要改变。后面还要继续循环赋值要判断状态的。
store[num] = i;//这个位置赋值。
backTrack(num+1);//进入下一个位置继续进行上面的操作
status[i] = false;//用完之后,恢复成初始值。
}
}
}
public static boolean check(){
double temp1 = store[1];
double temp2 = store[2] * 1.00 /store[3];
double temp3 = (store[4]*100 + store[5]*10 + store[6]) * 1.00 / (store[7]*100 + store[8]*10 +store[9]);
if(temp1+temp2+temp3 == 10)
return true;
return false;
}
}
if(temp1+temp2+temp3 == 10)
return true;
一开始我写这两句没什么的,后来回头检查发现有点不舒服。temp1+temp2+temp3的和是double型,而10是int型,可以比较吗?但是代码跑起来没问题,网上查了一下,发现其实会自动类型升级(type promotion),也就是10会升级为double型再比较。OK,虽说这道题没有多少回溯的味道,真正想体现一下回溯法的可以做一下八皇后问题,到此全部搞定。
具体想了解关于类型升级的和double类型的比较的,可以去下面两篇文章看看
https://blog.csdn.net/wcxiaoych/article/details/42806313
https://www.jianshu.com/p/6104ae66da6d