Hanoi塔问题

设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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值