汉诺塔问题

#include <stdio.h>

void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) {
	if (paraN <= 0) {
		return;
	} else {
		hanoi(paraN -1, paraSource, paraTransit, paraDestination);
		printf("%c -> %c \r\n", paraSource, paraDestination);
		hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
	}
}

void hanoiTest() {
	printf("---- addToTest begins. ----\r\n");
	
	printf("2 plates\r\n");
	hanoi(2, 'A', 'B', 'C');
	
	printf("3 plates\r\n");
	hanoi(3, 'A', 'B', 'C');
	
	printf("---- addToTest ends. ----\r\n");
}

int main()  {
	hanoiTest();
	return 0;
}

 

心得体会

假设要将n个盘子从A移动到C,我们可以先将n设为3,可以分为上动图的七步进行,读者可以尝试将n设为一个10,尝试将每一步写出来,很明显写出每一个步骤非常复杂,这时我们就需要对问题进行思考,更改思路,将复杂的问题简单化。

我们先将n设定为2,这时我们可以发现整个过程变得非常简单,先将上层盘子从A移到B,再将下层盘子从A移到C,最后将B上的盘子移到C就完成了整个步骤,因此对于n个盘子来说,我们可以先将上方的n-1个盘子看作一整个盘子,这时就变成了移动两个盘子的简单问题。

我们继续思考,如果我们先将上方的n-1个盘子移动到了B,这时可以将A的一个盘子移到C,但是我们直接移动B上的n-1个盘子是不现实的,这时我们可以再将n-2个盘子看作一个整体,先倒数第二个盘子放到C上,
此时我们要将第n-1个盘子移到C可以先将上面的n-2个盘子移到A,在移动第n-1个盘子到C。

此时除去最右边两个盘子不看,A上的盘子又和初始状态一样,这样不断地进行递归,直到将第一个盘子移到C上,问题就解决了,不难看出,任务完成的条件是只移动一个盘子到C,否则递归将进行下去。 

1.什么是汉诺塔
  汉诺塔(Tower of Hanoi),又称河内塔。源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

2.如何用C语言实现汉诺塔

  现有三个柱子A、B、C,其中有n个圆盘在A柱上,最终要实现把这n个圆盘从A柱借助B柱移动到C柱上。实现实现思路:先将n-1个圆盘从A柱移动到B柱上,然后将A柱上最后一个圆盘移动到C柱上,最后再把B柱上的n-1个圆盘移动到C柱上

当n=1时:
1.将A柱上最后一个圆盘移动到C柱上(A →C)

当n=2时:
1.将1个圆盘从A柱移动到B柱上,重复n=1时的步骤,只不过是将那1个圆盘(从A借助于B移动到C)改为(从A借助于C移动到B)
2.将A柱上最后一个圆盘移动到C柱上(A →C)
3.将B柱上的1个圆盘移动到C柱上。重复n=1时的步骤,只不过是将那个圆盘(从A借助于B移动到C)改为(从B借助于A移动到C)

当n=3时:
1.将2个圆盘从A柱移动到B柱上。重复n=2时的步骤,只不过是将那2个圆盘(从A借助于B移动到C)改为(从A借助于C移动到B)
2.将A柱上最后一个圆盘移动到C柱上(A →C)
3.将B柱上的2个圆盘移动到C柱上。重复n=2时的步骤,只不过是将那2个圆盘(从A借助于B移动到C)改为(从B借助于A移动到C)

当n=4时:
1.将3个圆盘从A柱移动到B柱上。重复n=3时的步骤,只不过是将那3个圆盘(从A借助于B移动到C)改为(从A借助于C移动到B)
2.将A柱上最后一个圆盘移动到C柱上(A →C)
3.将B柱上的3个圆盘移动到C柱上。重复n=3时的步骤,只不过是将那3个圆盘(从A借助于B移动到C)改为(从B借助于A移动到C)

以此类推,当汉诺塔上的圆盘数为n个时该如何移动,只需要按照上面的规律一直往上递归,最终是可以达到目的的。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值