这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
算法思想:将A-I所代表的数字进行全排列,然后进行检查看看是否符合等式。
数据域:
1.private static int[] visited;
主要是用来表示数据是否被访问过(0表示数据尚未被访问过,1表示数据已经被访问过了)。
2.private static double[] save;
用来存储数据。
3.private static int sum;
用来计数,统计符合该等式的情况数。
方法:
1.数据的初始化
private static void init() {
visited=new int[9];
for(int i=0;i<9;i++) {
visited[i]=0;//0表示尚未被访问,1表示已经被访问过了
}
save=new double[9];
}
2.检测是否满足等式
private static boolean check() {
double def=save[3]*100+save[4]*10+save[5];
double ghi=save[6]*100+save[7]*10+save[8];
double left=save[0]+save[1]/save[2]+def/ghi;
if(left==10) {
return true;
}
return false;
}
3.进行深度搜索
private static void dfs(int step) {
if(step>8) {
if(check()==true) {
sum++;
}
return;//注意return不可写在if语句里面
}
else {
for(int i=1;i<10;i++) {
if(visited[i-1]==0) {//当前的数字没有被访问
save[step]=i;
visited[i-1]=1;//设置当前数字状态为已经被访问过了
dfs(step+1);
visited[i-1]=0;//回溯
}
}
}
}
注意:保存数据的元素类型应该是double型,而不应该是int型。
答案:29