【例一】:
今有 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; } } } }
【例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是个好算法啊,哈哈