page contents

C语言-经典算法问题-河内之塔问题(汉诺塔问题)

河内之塔问题(汉诺塔问题)是一个非常经典的算法问题,可以使用递归的思想求解此问题,这个问题可以帮助我们理解递归的基本思路。
河内之塔问题
河内之塔又称为汉诺塔问题。
1、问题说明:
    河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)1883年从泰国带至法国的,河内为越战时
北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世
纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64
个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根
石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬
运完毕之时,此塔将毁损,而也就是世界末日来临之时。
2、问题解法:
    如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘
子,就将B当作辅助柱。如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处
理两个盘子,也就是:A->BA ->CB->C这三个步骤,而被遮住的部份,其实就是进入程式
的递回处理。事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1,所以当盘数为64时,则
所需次数为:2 64- 1 = 184467440737095516155.05390248594782e+16年,也就是约5000世 纪 ,
如果对这数字没什幺概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。
3、C语言程序代码:
#include <stdio.h>
void hanoi(int n, char A, char B, char C) {
if(n == 1) {
printf("Move sheet %d from %c to %c\n", n, A, C);
}
else {
hanoi(n-1,A, C, B);
printf("Move sheet %d from %c to %c\n", n, A, C);
hanoi(n-1, B,A, C);
}
}
int main() {
int n;
printf("请输入盘数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
  • 发表于 2021-08-16 17:20
  • 阅读 ( 535 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小威
小威

64 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章