递归经典:汉诺塔问题 C++

 问题描述:

简单来讲,汉诺塔问题是这样的:

​       给定三根柱子,记为 A,B,C ,其中 A 柱子上有 n 个盘子,从上到下编号为 0 到 n−1 ,且上面的盘子一定比下面的盘子小。问:将 A 柱上的盘子经由 B 柱移动到 C 柱应该怎么移动?

​ 移动时应注意:

 ① 一次只能移动一个盘子

​ ②大的盘子不能压在小盘子上

 分析:将n个盘子从A移到C可以分解为三步

(1)将n-1个盘子从A移到B;

(2)将A上剩下的一个盘子移到C上;

(3)将B上的n-1个盘子移到C上。

ps:复杂问题简单化,就看做A上只有两个盘子,则步骤就是  A-->B,A-->C,B-->C,完成!

#include<iostream>
using namespace std;

void move(char a, char c)
{
	cout << a << "-->" << c << endl;
}

void hanoi(int n, char a, char b, char c)
{
	if (n == 1)
		move( a, c);
	else
	{
		hanoi(n - 1, a, c, b);
		move(a, c);
		hanoi(n - 1, b, a, c);
	}
}

int main()
{
	int m;
	cin >> m;
	hanoi(m, 'A', 'B', 'C');
	return 0;
}

2//输入
A-->B
A-->C
B-->C

3
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C 

4
A-->B
A-->C
B-->C
A-->B
C-->A
C-->B
A-->B
A-->C
B-->C
B-->A
C-->A
B-->C
A-->B
A-->C
B-->C 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值