c和c++的一些训练题5(汉诺塔)

传说婆罗门庙里有一个塔台,台上有3根标号为A,B,C的用钻石做成的柱子,在A柱子上放着64个金盘,每一个都比下面的略小一些。把A柱子上的金盘子全部移到C柱上的那一天就是世界末日。移到的条件是:一次只能移到一个金盘,移到过程中大金盘不能放在小金盘上面。庙里的僧人一直在移个不停。因为全部的移动是2641次,如果每秒移动一次的话需要500亿年。

思考:这是一个典型的递归算法。我们要做到把64个金盘传到C柱上,我们需要:

1.首先把前63个盘子全部移到B柱上。

2.然后把最下面的盘子移动到C柱上。

3.最后将前63个盘子移动到C柱上。

可以推出这样一个设计思路:

1.把前n-1个盘子从A柱移动到B柱。

2.把第n个盘子从A柱移动到C柱。

3.把前n-1个盘子从B柱移动到C柱。

递归的思想在第1步和第3步中得到体现,从n个盘子减少为n-1个盘子,继续下去的第1、3步就是从n-1步减少到n-2步,直至减少到n=1这个已知的条件。

下面是编程实现:

// Hanoi.cpp : 
//
#include "stdafx.h"
#include <iostream>

using namespace std;

void move(int n, char a, char b, char c)
{
	if (1==n)
	{
		cout<<a<<" --> "<<c<<endl;
	}
	else
	{
		move(n-1, a,c,b);
		cout<<a<<" --> "<<c<<endl;
		move(n-1,b,a,c);
	}
}
int main()
{
	int n;
	cout<<"Please enter the layers of Hanoi: ";
	cin>>n;
	move(n, 'A', 'B', 'C');
	system("pause");
	return 0;
}
以3层为例输出结果为:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值