汉诺塔问题(递归算法)

题目

有三个柱子分别是A、B、C,其中A柱子上有若干盘子,要将盘子从A柱上移动到C柱上,注意A柱子上的盘子是从大到小(从下到上)排列,大盘子不能放在小盘子上,不然会碎掉。

程序思路

我们可以将其划分为大小问题的方法,即:先将A中n-1个盘子通过C柱子移动到B柱,之后将第n个盘子移到C柱上,最后将B柱上的n-1个盘子通过A柱移到C柱上。这样便可以解决问题。

程序代码

#include <bits/stdc++.h>

using namespace std;

void move(int n,char x,char y)
{
	cout << "将" << n << "从" << x << "移到" << y << "中" << endl; 
}

void Hanno_tower(int n,char a,char b,char c)
{
	//这里只是需要一个出口 ,不然程序会陷入死循环 
	if(n==0){
//		cout << "将" << n << "从" << a << "移到" << c << "中" << endl; 
		return;
	}
	Hanno_tower(n-1,a,c,b);//将n-1个盘子从a中通过c移动到b柱上 
	move(n,a,c);// 
	Hanno_tower(n-1,b,a,c);//将n-1个盘子从b中通过a移动到c柱上 
}

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

实验结果

样例一:输入3(表示3个碟子)

样例二:输入4(表示4个碟子)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值