采用暴力和DFS的差距是:5836ms和55ms,所以可以看出算法的重要性
package cn.stu.test;
public class TestNineNumberAdd {
/**
* 求□□□+□□□=□□□的个数。
*
* @param args
*/
public static void main(String[] args) {
int[] book = new int[10];// 记录各个位是否存在,存在的相应位为1,用过遍历该数组就可以知道九个位是否各不相同
int[] a = new int[10]; // 记录各个位的数值大小
int sum = 0; // 总数
int flag = 0; // 标志位,如果九个数值各不相同就为0
for (a[1] = 1; a[1] <= 9; a[1]++) {
for (a[2] = 1; a[2] <= 9; a[2]++) {
for (a[3] = 1; a[3] <= 9; a[3]++) {
for (a[4] = 1; a[4] <= 9; a[4]++) {
for (a[5] = 1; a[5] <= 9; a[5]++) {
for (a[6] = 1; a[6] <= 9; a[6]++) {
for (a[7] = 1; a[7] <= 9; a[7]++) {
for (a[8] = 1; a[8] <= 9; a[8]++) {
for (a[9] = 1; a[9] <= 9; a[9]++) {
// 先将标记用的数组清零
for (int i = 1; i <= 9; i++) {
book[i] = 0;
}
// 遍历九个位,并在相应的标记位置一
for (int i = 1; i <= 9; i++) {
book[a[i]] = 1;
}
// 判断九个位是否各不相同
for (int i = 1; i <= 9; i++) {
if (book[i] == 0) {
flag = 1;
break;
}
}
// 各不相同再进行相应的操作
if (flag == 0) {
if (a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10
+ a[6] == a[7] * 100 + a[8] * 10 + a[9]) {
System.out.print(a[1] * 100 + a[2] * 10 + a[3] + "+");
System.out.print(a[4] * 100 + a[5] * 10 + a[6] + "=");
System.out.println(a[7] * 100 + a[8] * 10 + a[9]);
sum++;
}
}
// 清除标志位
flag = 0;
}
}
}
}
}
}
}
}
}
System.out.println("sum is " + sum / 2);
}
}
优化逻辑是可以采用深度优先DFS算法来计算
package cn.stu.test;
public class TestSuanFa {
static int[] book = new int[10];//存放该号码是否已经被用过了
static int[] step = new int[10];//记录现在是到了哪一位数字了,从1开始,所以要到10 位
static int sum = 0; //记录符合的个数,结果再除以2即可
public static void main(String[] args) {
//采用DFS,从第一位开始赋值
//DFS的核心就是考虑当前的情况,
//至于下一步怎么做,则是下一步应该考虑的事
dfs(1);
System.out.println(sum/2);
}
public static void dfs(int num) {
if(num == 10){
//如果九个空格已经赋值,即可以判断是否符合条件
if(100*step[1]+10*step[2]+step[3] + 100*step[4]+10*step[5]+step[6] == 100*step[7]+10*step[8]+step[9]){
sum ++ ;
System.out.print(100*step[1]+10*step[2]+step[3]+"+");
System.out.print(100*step[4]+10*step[5]+step[6]+"=");
System.out.print(100*step[7]+10*step[8]+step[9]);
System.out.println();
}
return;//注意符合条件的时候一定要返回回去
}
for(int i = 1;i<10;i++){
if(book[i] == 0){
step[num] = i;
book[i] = 1;
dfs(num+1);
book[i] = 0;
}
}
return;
}
}