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

【例一】:

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

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

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

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

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

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

packageACM;import java.util.*;public classMain {static int[] a={7,4,0,0,0,0,4,0,7,0,0,0,0,0};public static voidmain(String[] args) {

ss(1);

}static void ss(intn){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;

}

}

}

}

【例2】:

三羊献瑞

观察下面的加法算式:

祥 瑞 生 辉

+   三 羊 献 瑞

-------------------

三 羊 生 瑞 气

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

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

packageACM;import java.util.*;public classMain {static int[] a=new int[10]; //祥瑞生辉三羊献气

static int[] b={0,0,0,0,0,0,0,0,0,0};public static voidmain(String[] args) {

dfs(1);

}static void dfs(intstep){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 个数字表示数独的解。

例如:

输入(即图中题目):

20cc030715651ccb882ad3c52940cd47.png

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

packageACM;import java.util.*;public classMain {static int[][] a=new int[9][9];static int count=0;public static voidmain(String[] args) {

Scanner scanf=newScanner(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,intcol){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是个好算法啊,哈哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值