非常暴力的搜索算法——深度优先搜索算法

前景导入

第一题

有1-9 9个数,选取3个数组成以下格式:
? + ? = ?
数字只能用一次,不能重复

/**
 * 有1-9 9个数,选取3个数组成以下格式:
 *  ? + ? = ?
 *  数字只能用一次,不能重复
 */
public class demo1 {
    public static void main(String[] args) {
        int min=1;
        int max=9;
        for (int i = min; i < max ; i++) {
            for(int j=min;j < max ; j++){
                int result=i+j;
                if(i != j && result <= 9 && result != i && result != j){
                    System.out.println("得到结果"+i+"+"+j+"="+result);
                }
            }

        }
    }
}

第二题

有1-9 9个数,选取3个数组成以下格式:
?? + ?? = ??
数字只能用一次,不能重复
如:12+35=47

public class demo2 {
    public static void main(String[] args) {
        int min=1;
        int max=9;
        for (int i = min; i < max ; i++) {
            for(int j=min;j < max ; j++){
                for (int k = min; k < max; k++) {
                    for (int l = min; l < max ; l++) {
                        for (int m = min; m < max ; m++) {
                            for (int n = min; n < max ; n++) {
                                if(i != j && j != k && k != l && l !=m && m != n ...
                                && (10*i+j)+(10*k+l)==10*m+n){
                                    System.out.println("得到结果"+i+j+"+"+k+l+"="+m+n);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

第三题

有1-9 9个数,选取3个数组成以下格式:
??? + ??? = ???
数字只能用一次,不能重复
如:124+659=783

public class demo3 {
    public static void main(String[] args) {
        int min=1;
        int max=9;
        for (int i = min; i < max ; i++) {
            for(int j=min;j < max ; j++){
                for (int k = min; k < max; k++) {
                    for (int l = min; l < max ; l++) {
                        for (int m = min; m < max ; m++) {
                            for (int n = min; n < max ; n++) {
                                for (int o = min; o < max ; o++) {
                                    for (int p = min; p < max; p++) {
                                        for (int q = min; q < max ; q++) {
                                            if(i != j && j != k && k != l && l !=m && m != n &&
                                                    n != o && o != p && p != q && ...
                                                    (100*i+10*j+k)+(100*l+10*m+n)==100*o+10*p+q){
                                                System.out.println("得到结果"+i+j+k+"+"+l+m+n+"="+o+p+q);
                                            }
                                        }
                                    }
                                }

                            }
                        }
                    }
                }
            }
        }
    }
}

3个题做下来是不是觉得代码非常繁琐和冗余,这时候就要考虑一些算法了。下面我就来讲讲一个算法。

深度优先搜索算法

又有一个题,有整数1,2,3.对这三个数进行全排列,输出所有的情况。
如 123 132 213
231 321 312

一般情况下就可以使用3个for循环进行循环排列,但很显然这就显得比较的笨重,这时候就可以使用深度优先搜索算法

/**
 * 深度优先搜索算法
 */
public class demo4 {

    static int max=3;
    static boolean[] flag=new boolean[max];
    static int[] data=new int[max];

    private static void dfs(int pos){
        if(pos ==max){
            for(int d :data){
                System.out.print(d + ",");
            }
            System.out.println("\n");
        }
        for (int i = 0; i < max; i++) {
            if(flag[i] == false){
                flag[i]=true;
                data[pos]=i+1;
                dfs(pos+1);
                flag[i]=false;
            }
        }
    }


    public static void main(String[] args) {
        dfs(0);
    }
}

第二题
就是刚刚的第三题,也可以使用深度优先搜索算法

有1-9 9个数,选取3个数组成以下格式:
??? + ??? = ???
数字只能用一次,不能重复
如:124+659=783

/**
 * 有1-9 9个数,选取3个数组成以下格式:
 * ??? + ??? = ???
 * 数字只能用一次,不能重复
 * 如:124+659=783
 * 使用深度优先搜索算法
 */
public class demo5 {

    static int max=9;
    static boolean[] flag=new boolean[max];
    static int[] data=new int[max];

    private static void dfs(int pos){

        //对所有的结果输出时进行筛选
        if(pos == max && 100*data[0]+10*data[1]+data[2]+100*data[3]+10*data[4]+data[5] == 100*data[6]+10*data[7]+data[8]){
            System.out.println("得到结果"+data[0]+data[1]+data[2]+"+"+data[3]+data[4]+data[5]+"="+data[6]+data[7]+data[8]);
        }

        //先把所有全排列的结果全部列出来
        for (int i = 0; i < max; i++) {
            if(pos == max +1)
                return;
            if(flag[i] == false){
                data[pos]=i+1;
                flag[i]=true;
                dfs(pos+1);
                flag[i]=false;
            }
        }
    }

    public static void main(String[] args) {
        dfs(0);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值