【刷题第二天】dfs算法例题——java

【例一】:

今有 7 对数字:两个 1,两个 2,两个 3...两个 7,把它们排成一行。

要求,两个 1 间有 1 个其它数字,两个 2 间有 2 个其它数字,以此类推,两个 7 之间有

7 个其它数字。如下就是一个符合要求的排列:17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以 74 开头的。

注意:只填写这个 14 位的整数,不能填写任何多余的内容,比如说明注释等。

package ACM;

import java.util.*;
public class Main {
    static int[] a={7,4,0,0,0,0,4,0,7,0,0,0,0,0};
    public static void main(String[] args) {
        ss(1);
        
    }
    static void ss(int n){
        if(n==4)n++;
        if(n>=7){
            for(int i=0;i<14;i++)
                System.out.print(a[i]);
        }
        for(int i=2;i<14;i++){
            if(n+i+1<14&&a[i]==0&&a[n+i+1]==0){
                a[i]=a[n+i+1]=n;
                ss(n+1);
                a[i]=a[n+i+1]=0;
            }
        }
    }
}
扫描二维码关注公众号,回复: 7998124 查看本文章

【例2】:

三羊献瑞
观察下面的加法算式:

       祥 瑞 生 辉
  +   三 羊 献 瑞
-------------------
   三 羊 生 瑞 气


其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

package ACM;

import java.util.*;
public class Main {
    static int[] a=new int[10];   //祥瑞生辉三羊献气
    static int[] b={0,0,0,0,0,0,0,0,0,0};
    public static void main(String[] args) {
        dfs(1);
    }
    static void dfs(int step){
        if(step==9){
            if((a[1]*1000+a[2]*100+a[3]*10+a[4])+a[5]*1000+a[6]*100+a[7]*10+a[2]==a[5]*10000+a[6]*1000+a[3]*100+a[2]*10+a[8]&&a[5]!=0){
                System.out.println(a[5]*1000+a[6]*100+a[7]*10+a[2]);
            }
            return;
        }
        for(int i=0;i<10;i++){
            if(b[i]==0){
                a[step]=i;
                b[i]=1;
                dfs(step+1);
                b[i]=0;
            }
        }
    }
}

 

【例三】:

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了 3 个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求,输入 9 行,每行 9 个字符,0 代表未知,其它数字为已知。

输出 9 行,每行 9 个数字表示数独的解。

例如:

输入(即图中题目

005300000

800000020

070010500

400005300

010070006

003200080

060500009

004000030

000009700

程序应该输出:

145327698

839654127

672918543

496185372

218473956

753296481

367542819

984761235

521839764

再例如,输入:

800000000

003600000

070090200

050007000

000045700

000100030

001000068

008500010

090000400

程序应该输出:

812753649

943682175

675491283

154237896

369845721

287169534

521974368

438526917

796318452

package ACM;

import java.util.*;
public class Main {
    static int[][] a=new int[9][9];
    static int count=0;
    public static void main(String[] args) {
        Scanner scanf=new Scanner(System.in);
        char[] ch=new char[81];
        String scan;
        scan=scanf.next();
        ch=scan.toCharArray();
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                a[i][j]=(int)ch[i*9+j]-48;
            }
        }
        dfs(0,0);
        
    }
    
    static boolean row(int n_row,int sz){     //判断一行是否有相同
        for(int i=0;i<9;i++){
            if(a[n_row][i]==sz)return false;
        }
        return true;
    }
    
    static boolean col(int n_col,int sz){     //判断一列是否有相同
        for(int i=0;i<9;i++){
            if(a[i][n_col]==sz)return false;
        }
        return true;
    }
    
    static boolean col_row(int row,int col,int sz){     //判断九宫格是否有相同
        for(int i=row/3*3;i<=row/3*3+2;i++){
            for(int j=col/3*3;j<=col/3*3+2;j++){
                if(a[i][j]==sz)return false;
            }
        }
        return true;
    }

    static void dfs(int row,int col){
        if(row>8){
            for(int i=0;i<=8;i++){
                for(int j=0;j<9;j++){
                    System.out.print(a[i][j]);
                }
                System.out.println();
            }
            return;
        }
        if(col>8)dfs(row+1,0);
        else if(a[row][col]!=0)dfs(row,col+1);
        else{
            for(int z=1;z<=9;z++){
                if(col(col,z)&&row(row,z)&&col_row(row,col,z)){
                    a[row][col]=z;
                    dfs(row,col+1);
                    a[row][col]=0;
                }
            }
        }
    }
}

dfs是个好算法啊,哈哈


猜你喜欢

转载自www.cnblogs.com/zymzymzym/p/11945977.html