文章资料来源如下,致谢midnight_time
1.拼凑型
- 第一件事,就是设数组
- 第二件事,数字能否重复使用?能,略过这条;不能,设标记数组,或者交换(我个人偏向设标记数组)
- 第三件事,定义dfs()方法
- 第四件事,判断递归结束条件,通常是index越界,并进行等式判断
- 第五件事,还未凑齐数,深度优先搜索
- 第六件事,写main()方法
此题和第二道题类似,都是1-9九个数字,不过这里要注意的是,第二题用乘法代替了除法,这道题虽然说也可以改成乘法,但是会相对麻烦一点,干脆就直接用除法,一旦涉及到除法,就有可能产生浮点数,所以我们在声明数组的时候不能再声明为int了,必须声明为double。
index还是int的,取值范围为0至8
dfs方法定义如下:
public static void dfs(double[] a,int index)
结束条件就是index==9,越界
if(index == 9) {
if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10)
count++;
return;
}
当index不够9的时候,进行深搜
for(int i=index; i<a.length; i++) {
double t = a[index]; a[index]=a[i]; a[i] = t;
dfs(a,index+1);
t = a[index]; a[index]=a[i]; a[i] = t;
}
完整代码
public class 凑算式交换法dfs {
public static int count = 0;
public static void dfs(double[] a,int index) {
// 结束条件
if(index == 9) {
if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10)
count++;
return;
} else {
for(int i=index; i<a.length; i++) {
double t = a[index]; a[index]=a[i]; a[i] = t;
dfs(a,index+1);
t = a[index]; a[index]=a[i]; a[i] = t;
}
}
}
public static void main(String[] args) {
double[] a = new double[] {1.00,2.00,3.00,4.00,5.00,6.00,7.00,8.00,9.00};
dfs(a,0);
System.out.println(count);
}
}
当然,这道题也可以像第一题“三羊献瑞”那样,使用递归之前标记法
【标记法完整代码】
public class 凑算式标记dfs {
public static double[] a = new double[9];
public static int[] visited = new int[] {0,0,0,0,0,0,0,0,0}; // 9个0
public static int count = 0;
public static void dfs(int index) {
// 结束条件
if(index == 9) {
if(a[0]+a[1]/a[2]+(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10)
count++;
return;
} else {
for(int i=1; i<=9; i++) {//因为数字是从1开始
if(visited[i-1] == 0) { // 因为i从1开始,所以需要 -1
visited[i-1] = 1; // 标记
a[index] = (double)i;
dfs(index+1);
visited[i-1] = 0; // 清除标记
}
}
}
}
public static void main(String[] args) {
dfs(0);
System.out.println(count);
}
}
对visited初始化的说明:
Java语言int型数组初始化时会自动赋值为0,但是我为了直观表达,所以选择了显式初始化。