汉诺塔问题描述:
假设有三个命名为a(TOWER 1),b(TOWER 2),c(TOWER 3)的塔座,在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,...,n的圆盘。现要求将a塔座上的n个圆盘移到c塔座上并按同样顺序叠排,
假设有三个命名为a(TOWER 1),b(TOWER 2),c(TOWER 3)的塔座,在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,...,n的圆盘。现要求将a塔座上的n个圆盘移到c塔座上并按同样顺序叠排,
圆盘移动时必须遵循下列规则:
1)每次只能移动一个圆盘;
2)圆盘可以插在a,b,c中的任意塔座上;
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
算法分析:
1.当n=1时,移动方式: a->c
2.当n=2时,移动方式: a->b, a->c, b->c
3.当n=3时, 移动方式: 我们需要把上面两个2,借助c塔,移动到b塔上,然后把a塔的最大的盘移动到c塔,再借助a塔把b塔的两个盘移动到c塔(调用f (2)函数)
1.当n=1时,移动方式: a->c
2.当n=2时,移动方式: a->b, a->c, b->c
3.当n=3时, 移动方式: 我们需要把上面两个2,借助c塔,移动到b塔上,然后把a塔的最大的盘移动到c塔,再借助a塔把b塔的两个盘移动到c塔(调用f (2)函数)
import java.util.Scanner;
public class Hanoi {
static long s = 0;
public static void main(String args[]) {
int n = 0;
Scanner console = new Scanner(System.in);
n = console.nextInt();
System.out.println("汉诺塔层数为" + n);
System.out.println("移动方案为:");
hanoi(n, 'a', 'b', 'c');
System.out.println("需要移动次数:" + s);
}
static void hanoi(int n, char a, char b, char c) { //a为初始塔,b为中间塔,c为目标塔
if (n == 1){
System.out.println("n=" + n + " " + a + "-->" + c);
s++;
}
else{
/*递归的调用*/
hanoi(n-1,a,c,b);
System.out.println("n=" + n + " " + a + "-->" + c);
hanoi(n-1,b,a,c);
s++;
}
}
}