问题来源:
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。
游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
那么我们如何用C语言解决这个问题呢?
First,让我们简化一下这个问题:
假设只有一个盘子:
如果有两个盘子:
那么如果有三个及以上呢?
接下来就是函数代码:
#include <stdio.h>//汉诺塔问题
int count = 0;
void hanoi(char A, char B, char C, int n)//将n层从A借助B移到C
{
if (n == 1)//一层直接挪
{
count++;//打印前,count加一,显示步数
printf("第%d步,把第%d层从%c挪到%c\n", count, n, A, C);
}
else//2层及以上运用上图讲解方法腾挪
{
hanoi(A, C, B, n - 1);//将n-1层从A借助C移到B
count++;//打印步数前记得步数count加1
printf("第%d步,把第%d层从%c挪到%c\n", count, n , A, C);
hanoi(B, A, C, n - 1);//将n-1层从B借助A移到C
}
}
int main()
{
int n = 0;//n为汉诺塔层数
char A = 'A', B = 'B', C = 'C';
scanf("%d", &n);
hanoi(A, B, C, n);
return 0;
}