Hanoi塔问题

来源:互联网 发布:影响二次销售 淘宝介入 编辑:程序博客网 时间:2024/05/29 13:39

设a,b,c是3个塔。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,3,...,n,如图2-1所示。现要求将塔座a上的这一叠圆盘移到塔座b上,并按照同样顺序重叠。在移动圆盘时应该遵守以下移动规则。

规则(1):每次只能移动1个圆盘;

规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;

规则(3):在满足移动规则(1)和规则(2)的前提下,可将圆盘移至a,b,c中任一座塔上。

算法理解:

假设塔座a,b,c排成一个三角形,a——>b——>c——>构成一个顺时循环,在移动圆盘的过程中,若是奇数次移动,则将最小的圆盘顺时针移动下一个塔座;若是偶数次移动,则最小的圆盘不动,移动另外两个塔座上的圆盘,将较小的圆盘移到另一个塔座上。

递归方法:

即先将最小的盘从a塔座移到b塔座,剩下的n-1个盘借助a,b塔座移动到c 塔座,然后将最小的盘移到a塔座,将n-1个盘移到b盘,最后将最小的圆盘移到b盘。

代码如下:

package cn.aaa;


import java.util.Scanner;

public class Hanoi {
//汉诺塔问题解决方法
public static void Hanoi(int n,char a,char b,char c) {//a是初态,b是终态,c是中间媒介
if(n==1){
swap(a,b);
}else{
   Hanoi(n-1,a,c,b);//将n-1个盘从a移到c
   swap(a,b);       //将第n个盘从a移到b
   Hanoi(n-1,c,b,a);//将之后n-1(其实现在是n-2)个盘从c移动到b
}
}
//交换函数
public static void swap(char a,char b) {
System.out.println(a+">>"+b);
}
public static void main(String[] args) {
int n;
System.out.println("请输入一个正整数n:");
Scanner s = new Scanner(System.in);
n = s.nextInt();
System.out.println("圆盘的移动为:");
Hanoi(n,'A','B','C');
}
}

结果如下:


0 0