Honoi塔问题
作者:Ackarlix
Hanoi塔问题,这是一个古典的数学问题,是一个只有用递归方法解决的问题。问题是这样的:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在上,小盘在下。在移动过程中可以利用B座。
将n个盘子从A座移到C座可以分解为以下3个步骤:
(1).将A上n-1个盘借助C座先移到B座上;
(2).把A座上剩下的一个盘移到C座上;
(3).将B上n-1个盘借助A座先移到C座上。
(1).将A上n-1个盘借助C座先移到B座上;
(2).把A座上剩下的一个盘移到C座上;
(3).将B上n-1个盘借助A座先移到C座上。
程序如下:
#i nclude <stdio.h>
void move(char x,char y)
{ static int i=0;
printf("%3d.%c-->%c/n",++i,x,y);
}
{ static int i=0;
printf("%3d.%c-->%c/n",++i,x,y);
}
void hanoi(int n,char one,char two,char three)
{ /* 将n个盘子从one座借助two座,移到three座 */
if(n==1) move(one,three);
else
{ hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
{ /* 将n个盘子从one座借助two座,移到three座 */
if(n==1) move(one,three);
else
{ hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void main()
{
int m;
printf("输入盘子数(最好2~9之间):");
scanf("%d",&m);
printf("移动%d个盘子的步骤为:/n",m);
hanoi(m,'A','B','C');
}
{
int m;
printf("输入盘子数(最好2~9之间):");
scanf("%d",&m);
printf("移动%d个盘子的步骤为:/n",m);
hanoi(m,'A','B','C');
}
输出结果为(红色为键盘输入的数据):
输入盘子数(最好2~9之间):3
移动3个盘子的步骤为:
1.A-->C
2.A-->B
3.C-->B
4.A-->C
5.B-->A
6.B-->C
7.A-->C
移动3个盘子的步骤为:
1.A-->C
2.A-->B
3.C-->B
4.A-->C
5.B-->A
6.B-->C
7.A-->C