一.起源:
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二.抽象为数学问题:
如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数.
import java.math.BigInteger; import java.util.Scanner; public class TowersOfHanoi { public static BigInteger count=new BigInteger("0"); public static void main(String args[]){ Scanner in=new Scanner(System.in); char a='a'; char b='b'; char c='c'; while(in.hasNext()){ int n=in.nextInt(); hannuo(n,a,b,c); System.out.println("一共:"+count+"次"); count=new BigInteger("0"); } } public static void move(int M,char x,char y){ count=count.add(new BigInteger("1")); System.out.println("第"+count+"移动"+":"+M+":"+x+"->"+y); } public static void hannuo(int n,char a,char b,char c){ if(n==1){ count=count.add(new BigInteger("1")); System.out.println("第"+count+"移动"+":"+n+":"+a+"->"+c); }else{ hannuo(n-1,a,c,b); move(n,a,c); hannuo(n-1,b,a,c); } } }
import java.util.Scanner;
public class TowersOfHanoi {
static int m =0;//标记移动次数
//实现移动的函数
public static void move(int disks,char N,char M) {
System.out.println("第" + (++m) +" 次移动 : " +" 把 "+ disks+" 号圆盘从 " + N +" ->移到-> " + M);
}
//递归实现汉诺塔的函数
public static void hanoi(int n,char A,char B,char C) {
if(n == 1)//圆盘只有一个时,只需将其从A塔移到C塔
TowersOfHanoi.move(1, A, C);//将编b号为1的圆盘从A移到C
else {//否则
hanoi(n - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔
TowersOfHanoi.move(n, A, C);//把A塔上编号为n的圆盘移到C上
hanoi(n - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
char A = 'A';
char B = 'B';
char C = 'C';
while(in.hasNext()){
System.out.println("******************************************************************************************");
System.out.println("这是汉诺塔问题(把A塔上编号从小号到大号的圆盘从A塔通过B辅助塔移动到C塔上去");
System.out.println("******************************************************************************************");
System.out.println("请输入圆盘的个数:");
int disks = in.nextInt();
TowersOfHanoi.hanoi(disks, A, B, C);
System.out.println(">>移动了" + m + "次,把A上的圆盘都移动到了C上");
}
in.close();
}
}