Hanoi Tower 汉诺塔问题/c

来源:本站
导读:目前正在解读《Hanoi Tower 汉诺塔问题/c》的相关信息,《Hanoi Tower 汉诺塔问题/c》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《Hanoi Tower 汉诺塔问题/c》的详细说明。
简介:作为一个编程初学者,写下这些东西主要是为了加深自己的理解,当然如果能对各位有所帮助,是本人的荣幸。如有错误之处敬请指出。

问题描述:

有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图)。

把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘

子始终保持大盘在下,小盘在上。

描述简化:把A柱上的n个盘子移动到C柱,其中可以借用B柱。

Hanoi Tower 汉诺塔问题/c

我们假设有n个盘子,编号为:1,2,3,4……n。

(请问:把大象装冰箱里一共分几步? 三步。) prefect!

接下来我们分三步走:

初始状态是A柱上有n个盘子,B、C两个柱子空。要想将盘子移到C柱上,首先要把第n个盘子移到C柱上,而要移动第n个盘子就要先把前n-1个盘子移动到B柱上。所以

第一步:将前n-1个盘子移动到B柱上(先不用管怎么移动),将第n个盘子移动到C柱上。

移动后的状态是A柱空,B柱上有n-1个盘子,C柱空(因为第n个盘子最大,其他所有盘子都可以放,所以C柱上相当于空。)

第二步:将B柱上的n-2个盘子移动到A柱上(先不用管怎么移动),将第n-1个盘子移动到C柱上。

移动后的状态和初始状态相同只是规模小了一点(前两步就已经实现了一次递归)

第三步:利用递归直至n=1.

我一再强调的:当要把最大盘子上面的所有盘子移动到另一个空柱上时,不要关心具体如何移动,只用把它看做一个函数可以完成即可,不用关心函数的具体实现。如果你的思路纠结在这里,就很难继续深入了。

给出c代码:

#include #include void hanoi(char src, char mid, char dst, int n){if (n == 1) {printf("Move disk %d from %c to %cn", n, src, dst);} else {hanoi(src, dst, mid, n - 1); //第一步printf("Move disk %d from %c to %cn", n, src, dst);hanoi(mid, src, dst, n - 1); //第二步}}int main(void){int n;while (scanf("%d", &n) != EOF) {hanoi('A', 'B', 'C', n);}return 0;}

提醒:《Hanoi Tower 汉诺塔问题/c》最后刷新时间 2024-03-14 00:55:52,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《Hanoi Tower 汉诺塔问题/c》该内容的真实性请自行鉴别。