Java解决汉诺塔问题

问题描述:假设有三个分别命名为A,B,C的塔座,在塔座A上插有n个直径大小各不相同,依小到大编号为1,2,…,n的圆盘。现要求将塔座A上的n个圆盘移至塔座C上,并按同样顺序叠排,圆盘移动时必须遵循以下规则:
(1)每次只能移动一个圆盘;
(2)圆盘可以插在A,B,C中的任一塔座;
(3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上;
问题分析:
这个问题可以采用分治求解的递归方法来解决这个问题。设最初在塔座A上的圆盘数为n,则当n=1时,只需直接将这个圆盘移到塔座C上就可以了;否则执行以下操作:
(1)用C做过度,将A柱上的(n-1)个盘子移到B上;
(2)将A柱上最后一个盘子直接移到C柱子上;
(3)用A做过度,将B上的(n-1)个盘子移到C柱子上;
解决代码如下:

package ACM;
import java.util.Scanner;
class myHanoi{
	public void move (int i,char a,char b)
	{
		System.out.println(i+" "+a+" "+b);
	}
	public void hanoi(int n,char a,char b,char c)
	{
		if(n==1)
			move (1,a,c);
		else
		{
		    hanoi(n-1,a,c,b);
			move(n,a,c);
	        hanoi(n-1,b,a,c);
		}
	}
}
public class Hanoi {
	public static void main(String[] args)
	{
		Scanner in=new Scanner(System.in);
		char A='A',B='B',C='C';
		int n;
		while(in.hasNext())
		{
			n=in.nextInt();
			myHanoi han=new myHanoi();
			han.hanoi(n, A, B, C);
		}
		in.close();
	}
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值