简介:
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
分析问题:
汉诺塔问题无疑就是将盘子按照一定的规律进行移动,可以进行列举
一个汉诺塔:A--->C
两个汉诺塔:A--->B,A--->C,B--->C,但是本质上从B借道通过到达C所以可以看作A--->C
三个汉诺塔若用两个汉诺塔的借道可以看作:
(A--->C,A---B,C---B)=A---B A---C=A---C (B---A,B---C,A---C)=B---C
以此类推n个汉诺塔也可以看作A--->B,A--->C,B--->C
代码 :
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void move( char a, char b)
{
printf("%c-->%c\n", a, b);
}
void hnt(int num, char a, char b,char c)
{
if (num == 1)
{
move(a, c);//如果只有一层汉诺塔直接a--->c
}
else//n层汉诺塔和n-1汉诺塔相似
{
hnt(num - 1, a, c, b);
move(a, c);
hnt(num - 1, b, a, c);
}//可以带入两层汉诺塔更直观
}
int main()
{
int a = 0;
printf("打印层数:");
scanf("%d", &a);
hnt(a, 'a', 'b', 'c');
return 0;
}