关于汉诺塔的神话故事:
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
1.汉诺塔问题:
题目:
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动
分析问题:
首先,知道有三个柱子 A B C,然后在A柱中放着从小到大的n个圆盘,这时要把全部圆盘移动到C柱上,并且保证递增大小的前提。
那么可以先把A柱看成起始柱
然后再把B柱看成辅助柱
最后把C柱看成目标柱
假设就n = 3,那么可以想到:A->C(此时先把最上面最小的移动到C),A->B(再把第二小的放在B处),C->B(再把最小的移到B处此时任然满足从小到大),A->C(把A中最下面也是A中最大的放在目标C处)。B->A(在把B上最小的在放在A出),B->C(第二小的放到C),最后把A->C(就完成了)
其中蓝色部分和橙色部分也是分别的递归不过他们的起始柱辅助柱和目标柱不同。
蓝色部分:他的起始柱是A,目标柱是B,辅助柱是C
橙色部分:他的起始柱是B,目标柱是C,辅助柱是A
总结:
在写n个圆盘时,我们可以先将n-1个圆盘移动到B柱上( 目标柱:B柱,辅助柱:C柱),然后再把最大的一个圆盘移动到C柱,最后再把n-1个圆盘移动从B柱上移到C柱上(目标柱:C柱,辅助柱:A柱)
通过上面的总结我们就能很容易的去写代码
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void Tower(char a, char b, char c, int n) { if (n == 0) { return;//当圆盘为0是返回 } Tower(a, c, b, n - 1); printf("%c -> %c", a, c);//把最大的盘放到C柱 Tower(b, a, c, n - 1); } int main() { int num = 0; scanf("%d", &num); Tower('A','B','C', num); //A B为辅助柱,A也是起始柱 //C为目标柱 return 0; }
raptor实现: