【例一】:
今有 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 个数字表示数独的解。
例如:
输入(即图中题目):
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是个好算法啊,哈哈