□□□+□□□=□□□的个数

采用暴力和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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值