简介:
汉诺塔问题是一个经典的递归问题,目标是将一堆大小不同的圆盘从一个柱子移动到另一个柱子,每次只能移动一个圆盘,并且大圆盘不能放在小圆盘上面。
实现要求:显示移动的步骤,和总共移动的次数。
思路:假设先将三根柱子设为A、B、C,要将A上的所有圆盘放在C盘上,当只有一个盘的情况,只需A->C;有两个盘时,是将上面盘移到B,再将底层盘移到C,最后将B上的上面盘移到C;三个盘时,把最底下以上的盘令为整体S,把B柱看成是C柱,执行有两个盘的情况的步骤后,将A最底下的盘移到C,这时再将B柱看成A柱,执行只有两个盘的情况,这样就完成了,以此类推。对于移到次数,就是2^n-1次(n为盘数)。
代码实现:
//汉诺塔问题
import java.util.Scanner;
public class test{
public static void main(String[] args){
Scanner myScanner = new Scanner(System.in);
HNT s = new HNT();
int layerCount = myScanner.nextInt();//layerCount为汉诺塔层数,即盘的个数
s.hnt(layerCount,'A','B','C');//'A'、'B'、'C'分别代表三个杆
int moveCount = s.count(layerCount);//移动的总次数为Math.pow(2,moveCount)-1,呈指数增长,所有输入layerCount(层数)时,尽量在10以内
System.out.println("移动总次数为:" + moveCount);
}
}
class HNT{
//打印移动步骤
public void hnt(int n,char a, char b, char c){
//只有一个盘时的情况
if(n == 1){
System.out.println(a + "->" + c);
}
//有多个盘时,将除了最底层盘之外的所有盘,看成一个盘,现在就只有两个盘
else{
hnt(n-1,a,c,b);//将上层盘移到B杆,
System.out.println(a + "->" + c);//将下层盘移到C杆
hnt(n-1,b,a,c);//将B杆上的盘移到C杆
}
}
//计算移动次数
public int count(int n){
if(n == 1){
return 1;
}
else{
return 2*count(n-1)+1;
}
}
}
运行结果: