对于汉诺塔游戏在这我不多阐述了。
我们直接进入正题,我把汉诺塔三根柱子命名为“起点柱”、“过度点柱”、“终点柱”。
这个游戏可以分为两个板块,一个是盘子个数b=1时,二是盘子个数n>1时。
当盘子个数n=1时,我们可以将处于起点柱的盘子直接移动到终点柱,即可完成任务。
当盘子个数n>1时,我们只需要将最大的盘子(最底下的盘子,此后命名为max盘)和大盘子以上的盘子看做是两个不同的整体。即max盘为一个单独整体,max盘以上的所有盘子看做是一个大整体。
无论是多少个盘子(n>1),max盘以上的所有整体都始终会在过度点柱停留,并且在max盘以上的所有整体在过度点停留时,max盘没移动到终点时,max盘始终存在于起点柱。
等max盘移动到终点柱后,我们可以将max盘看做于底座合体了,我们就可以不看起初的max盘,那原来的max盘以上的所有盘子都处于原来的过度点柱上,那我们可以将这个原来的过度点柱,看做是新的起点柱子,而原来的max盘所在处仍然为终点柱,而原来的起点柱便可以被看成后来的过度点柱。如此重复这个过程。便可使得所有的盘子都从起初的起点柱移动到了终点柱。
变换成c代码。
#include<stdio.h>
void hanoi(int num, char c, char z, char h)
//void表示该函数无返回值
{
if (num == 1)
printf("%c->%c\n", c, h);
//%c->%c的意思是,将c柱(当前起点柱)最上面的盘子移动到h柱(当前终点柱)上
else
{
hanoi(num - 1, c, h, z);
printf("%c->%c\n", c, h);
hanoi(num - 1, z, c, h);
//此时num-1个盘子处于z盘上,也就是原来的过度点柱上,现在我们可以
//将原来的过度点柱子也就是现在num-1盘子所在的柱子看作成新的起点柱
//那原来的起点柱就变成了现在的过度点柱。再用原来的思路如此往复即可
}
}
int main() {
int n = 0;
int a = 0;
scanf_s("%d", &n);
hanoi(n, 'A', 'B', 'C');//输入的值为三根柱子的name。
a = 2 * n - 1;//计算步骤。公式是通过前几次的列举得到的。
printf("一共需要%d个步骤才能完成", a);
return 0;
}