1.汉诺塔
代码解答:
package 第五天递归;
import java.util.Scanner;
public class 汉诺塔 {
static int times;
static void hannuota(int n,char A,char B,char C){
if(n==1){
move(n,A,C);
}else{
hannuota(n-1,A,C,B);
move(n,A,C);
hannuota(n-1,B,A,C);
}
}
static void move(int n,char rigth,char left){
System.out.println("第"+(++times)+"移动:盘子"+n+"从"+rigth+"->"+left);
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
char A='A';
char B='B';
char C='C';
hannuota(n,A,B,C);
}
}
注意事项:无
具体算法思想:重复过程,首先是以C作为中介,将A的盘子运到B上,然后再以A为中介,将B的盘子运到C上,最后再以B为中介,将A的盘子运到C上,所以用递归。
2.n皇后问题
问题描述加解析:
问题:
在一个 n X n 的棋盘上放置n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
解析
拿到问题先考虑存储方式,使用一维数组代表棋盘可以大大减少存储空间。
由题意可知,每一行必然只有一个皇后,因此递归时逐行摆放即可。
在放置当前行(第K行)的皇后时,应当检查0到k-1行的皇后与当前位置是否有冲突。
如果列号相同,冲突;如果两皇后的列间距等于行间距,说明二者在同一斜线上,冲突。
如果跟前面的行都没有冲突,则可以放置,继续递归下一行。
代码解答:
package 第五天递归;
import java.util.Scanner;
public class n皇后 {
static int [] queen=new int[100];
static int n;
static void postQueen(int[] queen,int k,int n){//假设k之前的都已经摆好位置了
if(k==n) {
for (int i = 0; i < n; i++) {
System.out.print(queen[i]+1+" ");
}
System.out.println();
}
for(int i=0;i<n;i++){
int j;
for( j=0;j<k;j++){
if(queen[j]==i||Math.abs(queen[j]-i)==Math.abs(j-k)){
break;
}
}
if(j==k){
queen[k]=i;
postQueen(queen,k+1,n);
}
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
postQueen(queen,0,n);
}
}
注意事项:Math.abs()求绝对值
算法思想:见代码