您的位置:首页 > 编程语言 > C语言/C++

基于C语言和递归思想实现汉诺塔

2020-03-29 18:39 204 查看

汉诺塔是源于印度一个古老传说的益智玩具。

传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

运行以下代码后归纳可得:转移N个圆盘需要移动2N-1次。

所以,婆罗门一共需要移动圆盘264-1次。

试玩这个小游戏,体验婆罗门的绝望:http://www.4399.com/flash/109504_1.htm

//hanoi.c

#include<stdio.h>

//#汉诺塔(hanoi)#
//有A B C三个木桩。
//木桩A上有N个圆盘,编号1到N,按编号从上往下排列,小在上,大在下。木桩B和C上是空的。
//问题:如何把A上的圆盘都移到C上,圆盘要仍然按原来的顺序排列。
//规则:可以借助B;每次只能移动一个顶端圆盘;不能将编号大的圆盘压在编号小的圆盘上。

void hanoi(int, char, char, char);

int main() {
int n;
char a = 'A';
char b = 'B';
char c = 'C';
printf("请输入汉诺塔圆盘数:");
scanf_s("%d", &n);
hanoi(n, a, b, c);
return 0;
}

void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf("将编号为%d的圆盘从%c移到%c\n", n, A, C);
}
else {
hanoi(n - 1, A, C, B);
printf("将编号为%d的圆盘从%c移到%c\n", n, A, C);
hanoi(n - 1, B, A, C);
}
}
//函数hanoi的逻辑:
//n表示圆盘数,ABC代表将一定数量的圆盘从A借助B移到C上。
//如果 只有1个圆盘,
//则直接将A上的圆盘移到C上。
//否则 先将A上的n-1个圆盘借助C移到B上,
//再将A上剩余的最后1个圆盘移到C上,
//最后将B上的n-1个圆盘借助A移到C上。

本文代码运行环境为Visual Studio Community 2019 16.4.6版本。

代码内容主要来自郝斌老师的课程https://www.bilibili.com/video/av6159200

如有疑问或建议,欢迎留言讨论。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Desmond_Woo 发布了8 篇原创文章 · 获赞 0 · 访问量 238 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: