汉诺塔问题

第一次尝试
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void Hanoi(int n,char a,char b,char c) {
    if (n == 1) {
        printf("%c-->%c\n",a,c);
    }
    else {
        Hanoi(n - 1,a,c,b);
        printf("%c-->%c\n",a,c);
        Hanoi(n - 1,b,a,c);
    }
}

int main() {
    printf("输入想要游戏的个数:\n");
    int n = 0;
    scanf("%d", &n);
    Hanoi(n, 'a', 'b', 'c');
    return 0;
}

汉诺塔问题很经典,使用的是递归思想,因此步骤不太好想,要想弄清每一步的过程,那估计得花费很多时间。我举个例子来说明一下想要弄清每一步怎样执行的,究竟是怎样的:来自知乎用户Fireman A的一个回答:如何理解汉诺塔的递归? - Fireman A的回答 - 知乎

  想象你来到某个热带丛林,意外发现了十层之高的汉诺塔。正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔。他名叫二傻,戴着一个草帽,草帽上有一个 2 字,号称会把一到二号盘搬到任意柱。
  你灵机一动,问道:“你该不会有个兄弟叫三傻吧?”
  “对对,老爷你咋知道的?他会搬一到三号盘。”
  “那你去把他叫来,我不需要你了。”
  于是三傻来了,他也带着个草帽,上面有个 3 字。
  你说:“三傻,你帮我把头三个盘子移到 c 柱吧。”
  三傻沉吟了一会,走进树林,你听见他大叫:“二傻,出来帮我把头两个盘子搬到C!”
  由于天气炎热你开始打瞌睡。朦胧中你没看见二傻是怎么工作的,二傻干完以后,走入林中大叫一声:“老三,我干完了!”
  三傻出来,把三号盘从 A 搬到 B,然后又去叫二傻:“老二,帮我把头两个盘子搬回 A!”
  余下的我就不多说了,总之三傻其实只搬三号盘,其他叫二傻出来干。最后一步是三傻把三号盘搬到 C,然后呼叫二傻来把头两个盘子搬回 C;
  事情完了之后你把三傻叫来,对他说:“其实你不知道怎么具体一步一步把三个盘子搬到 C,是吧?”
  三傻不解地说:“我不是把任务干完了?”
  你说:“可你其实叫你兄弟二傻干了大部分工作呀?”
  三傻说:“我外包给他和你屁相干?”
  你问到:“二傻是不是也外包给了谁?“
  三傻笑了:“这跟我有屁相干?”
  你苦苦思索了一夜,第二天,你走入林中大叫:“十傻,你在哪?”
  一个头上带着 10 号草帽的人,十傻,应声而出:“老爷,你有什么事?”
  “我要你帮把 1 到 10 号盘子搬到 C 柱“
  “好的,老爷。“十傻转身就向林内走。
  “慢着,你该不是回去叫你兄弟九傻吧“
  “老爷你怎么知道的?“
  “所以你使唤他把头九个盘子搬过来搬过去,你只要搬几次十号盘就好了,对吗?“
  “对呀!“
  “你知不知道他是怎么干的?“
  “这和我有屁相干?“
  你叹了一口气,决定放弃。十傻开始干活。树林里充满了此起彼伏的叫声:“九傻,来一下!“ “老八,到你了!““五傻!。。。“”三傻!。。。“”大傻!“
  你注意到大傻从不叫人,但是大傻的工作也最简单,他只是把一号盘搬来搬去。
  若干年后,工作结束了。十傻来到你面前。你问十傻:“是谁教给你们这么干活的?“
  十傻说:“我爸爸。他给我留了这张纸条。”
  他从口袋里掏出一张小纸条,上面写着:“照你帽子的号码搬盘子到目标柱。如果有盘子压住你,叫你上面一位哥哥把他搬走。如果有盘子占住你要去的柱子,叫你哥哥把它搬到不碍事的地方。等你的盘子搬到了目标,叫你哥哥把该压在你上面的盘子搬回到你上头。“
  你不解地问:“那大傻没有哥哥怎么办?“
  十傻笑了:“他只管一号盘,所以永远不会碰到那两个‘如果’,也没有盘子该压在一号上啊。”
  但这时他忽然变了颜色,好像泄漏了巨大的机密。他惊慌地看了你一眼,飞快地逃入树林。
  第二天,你到树林里去搜寻这十兄弟。他们已经不知去向。你找到了一个小屋,只容一个人居住,但是屋里有十顶草帽,写着一到十号的号码。


博客园发表于 2020-10-27 13:18

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值