汉诺塔问题Hanoi

  • 题目要求:
    一块板上有三根针,A,B,C。从A针上套有N个大小不等的圆盘,大的在下,小的在上,现在要将这N个盘子从A针移动到C针上,每次只能移动一个盘子,可以利用B针,但在任何情况下,任何针上的圆盘必须保证大盘在下,小盘在上的原则。
    自己画的略丑
    2.实现思路:
    运用递归的思想。想一想把大象放进冰箱需要几步,仅仅三步,同样这种思路也是,每一步骤分三步走:(1)先将第1~n-1个盘子移动到B盘上,(2)再将最底层的第N个盘子移动到C针上,(3)最后将B针上的n-1个盘子移动到C针上,这样问题不就解决了,但难就难在如何实现第(1)(3)步,由于每一次只能移动一个盘子,所以在移动的过程中显然要借助另一个针,即第(1)步将1到n-1个盘子借助C针移动到B针上;第(3)步要将B针上的n-1个盘子借助A针移动到C针上,这样显然又是两个新汉诺塔问题了
    在这里插入图片描述
    Q1:将1到n-2个盘子借助C针移到B针上
    Q2:要将B针上的n-1个盘子借助A针移动到C针上
    解决Q1:(1)将A针上的第1到62个盘子借助B针移到到C针上
    (2)再将第n-1个盘子移到B针上
    (3)最后将C针上的n-2个盘子借助A针移到B针上
    在这里插入图片描述
    解决Q2:(1)将B针上的第1到n-2个盘子借助C针移到到A针上
    (2)再将第n-1个盘子移到C针上
    (3)最后将A针上的n-2个盘子借助B针移到C针上
    同样的,上面的两个问题也是新的汉诺塔问题,解决的思路还是一样,显然是递归的思想,而递归的终止条件便是第(1)步和第(3)步所移动的盘子个数为1个为止。

-实现函数:
设计一个函数move(int n,char a,char b,char c)表示的意思就是将n个盘子从a针上借助b针移动到c针上

void move(int n,char a,char b,char c)
{
	if(n==1)
		printf("%c-->%c\n",a,c);
	else{
		move(n-1,a,c,b); //先将n-1个盘子从a针借助c针移到b针上,然后将第n个盘子直接移到c针上,也就是显示移动过程a->c
		printf("%c-->%c\n",a,c);
		move(n-1,b,a,c);     //最后将b上的N-1个盘子通过a针移到c针
	}
}

主函数调用部分:

int main(){
	int n;
	printf("请输入盘子的数目:\n");
	scanf("%d",&n);
	move(n,'A','B','C');
	return 0;
}

程序结果如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191025221040834.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MTQxNjgy,size_16,color_FFFFFF,t_70
这样就实现了经典的递归问题,汉诺塔问题

在这里插入图片描述

这是小白粗略见解,一定存在许多不足之处,希望大佬多指教!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值