汉诺塔

汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。
输入:
输入一个正整数N,表示又n个盘子在第一根柱子上
输出:
输出操作序列,格式为move t from x to y。每个操作一行,表示把x柱子上的编号为t的盘子挪到y柱子上。柱子编号为a,b,c,要用最少的操作把所有的盘子从a柱子上转移到c柱子上。
样例输入:
3
样例输出:
move 1 from a to c
move 2 from a to b
move 1 from c to b
move 3 from a to c
move 1 from b to a
move 2 from b to c
move 1 from a to c
解题思路:
其实算法很简单,当盘子的个数为n时,移动的次数为2^n-1。
一位美国读者发现的,首先把3根柱子排成品字形,所有圆盘按照顺序放在a上。若n为偶数,按顺时针依次摆放a,b,c;若为奇数,摆放a,c,b;
1.按顺时针方向把圆盘1从当前的柱子移到下一根柱子。
2.接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能会认为会有多种可能性,其实不然,可实施的行动是唯一的。
3.反复进行操作1和2,最后就能按照规定完成汉诺塔的移动
所以,结果非常简单,就是按照移动规则向一个方向移动金片。
例如:3阶汉诺塔的移动为:a->c,a->b,c->b,a->c,b->a,b->c,a->c.
AC代码:

#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
void Move(int n,char x,char y)
{
	cout << "move " << n << "from " << x << "to " << y << endl;
}
void Hannoi(int n,char a,char b,char c)
{
	if(n==1)
	{
		Move(1,a,c);
	}
	else
	{
		Hannoi(n-1,a,c,b);
		Move(n,a,c);
		Hannoi(n-1,b,a,c);
	}
}
int main()
{
	int n;
	scanf("%d",&n);
	Hannoi(n,'a','b','c');
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值