汉诺塔问题

本文介绍了经典的汉诺塔问题及其解决方案。通过递归思想,将n层汉诺塔分解为移动n-1层到辅助柱,然后移动第n层,最后再将n-1层移动到目标柱。代码实现中展示了如何使用递归函数H解决这个问题,当n=1时直接移动,否则通过递归调用来完成移动操作。
摘要由CSDN通过智能技术生成

        汉诺塔问题是一个经典问题,是一道练习递归的好题目。

        题目传送门

        题意:有a,b,c三个柱子,其中a中套有n个盘,下面的盘总是比上面的盘大。(为了方便称呼,我们记第 i 的盘子的编号为 i )在移动过程中,每次只能移动一个盘,且这个盘必须小于所放的位置下面的盘。试求出一个方案,描述出将这n个盘从a柱移动到b柱的方案。

 

        思考一下,也许n层的汉诺塔不好解决,但是能不能通过n-1层的汉诺塔来得到n层的呢?

        答案似乎是可以的。

        

        如图。第一步,将上面n-1层盘移动到c柱(在此过程中不会有问题,因为第n层盘最大,任何盘都可以放到它上面);第二步,将第n个盘移动到b柱(o(1));第三步,将原来的n-1层盘移到b柱。 

        好了?

        好了。

        这是一个递归:

                1.基础情况:当n=1时,不假思索,直接移动。

                2.单位操作:O(1)输出从第n个盘从a柱到b柱。

         好了,完成了。

        

#include<stdio.h>
#include<iostream>
int n;
char a,b,c;
void H(int now,char from,char help,char to){
	if(now==1){//当层数为1时,直接输出
		printf("%c->1->%c\n",from,to);
		return;
	}
	H(now-1,from,to,help);//调用n-1(相信它一定能行)
	printf("%c->%d->%c\n",from,now,to);//单位问题,O(1)解决
	H(now-1,help,from,to);//再调用n-1
}
signed main(){
	scanf("%d %c %c %c",&n,&a,&b,&c);//n个盘,a,b,c三个盘的名字
	H(n,a,c,b);//调用n层的汉诺塔
}

完结撒花。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值