##汉诺塔问题的简述
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。(源自百度百科)
这个游戏其实就是将盘子来回的移动,最终实现盘子从 A——C的完美转变。
##汉诺塔问题的分析
假设我们现在有3个盘子,从小到大放在A这个杆上面,要移动到C杆上面,而且每次只能够移动一个盘子,我们要如何实现这一过程呢?
这里我简单的画了个草图(画工不咋地),我们可以看到要实现这一个过程,一共要7步才能够完成,而在这7步当中我们能够很明显的看到要想把A杆中最大的那一个盘子移到C杆中去,我们需要将2个上面的盘子移到B中去。
在这里,就实现了第一次的递归,再剩下的2个盘子通过A移至C去。
可以看到如果一共有n个盘子,我们可以通过这样的办法移至C去
1. n-1——>B
2. A盘中最大的——>C
3. n-1——>C
这实际就是递归的思想,如果(n>2)大家想想在第3步的时候是不是就回到了第1步,来回的不停在1-3步之间来回穿梭。
##代码的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int count = 0;
int hanoi(int n, char x, char y, char z)
{
if (n == 1)
{
printf("将%d个从%c-->%c 第%d次\n",n, x, z,++count); //这里的从x——>z是确定了每次的方向不变,后面只需要改变杆子之间的顺序就可以了
}
else
{
hanoi(n - 1, x, z, y); //这里改变了z 和 y 的顺序,是为了能够将 n-1个盘子移至B中
printf("将%d个从%c-->%c 第%d次\n",n,x,z,++count); //这里直接将A杆中剩下的那个最大的传到C中
hanoi(n - 1, y, x, z); //这里再进行一次杆子顺序的改变是为了能够将B杆中剩下的 n-1 个移到C中去
}
}
int main()
{
int n = 0;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
以上就是我对于汉诺塔问题的理解,如果有不对的地方,欢迎各位大佬指正!