原题
有一个老和尚想把n个盘子从A座移动到C座(还有B座),但每次只允许移动一个盘子,且移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程打印出移动的步骤。
思路
想一想,如果是三个盘子怎么办?(假设最小的编号为1,第二小的编号为2…)
步骤一:将A座上2个盘子借助C移动到B座
1.1. 将A上1号从A移动到C座。
1.2. 将A上2号从A移动到B座。
1.3. 将C上1号从C移动到B座。
步骤二:将A座上的最大的盘子(3号)从A移动到C座(一步完成)。
步骤三:将B座上2个盘子借助C移动到A座上。是一个子问题。
3.1. 将B上1号从B移动到A座。
3.2. 将B上2号从B移动到C座。
3.3. 将A上1号从A移动到C座。
所以将A上n个盘子借助B从A移动到C可以分解为下面三个步骤:
- 将A上n-1个盘子借助C移动到B上。
- 将A上剩下的盘子从A移动到C上。
- 将B上n-1个盘子借助A从B移动到C上。这是一个子问题。
代码
#include <stdio.h>
void main()
{
void hanoi(int n,char one,char two,char three);
/* 对hanoi函数的声明 */
int m;
printf("input the number of diskes:");
scanf("%d", &m);
printf("The step to moveing %d diskes:\n", m);
hanoi(m, 'A', 'B', 'C');
}
void hanoi(int n, char one, char two, char three)
/* 定义hanoi函数, 将n个盘从one座借助two座,移到three座 */
{
void move(char x, char y); /* 对move函数的声明 */
if( n==1 )
{
move(one, three);
}
else
{
hanoi(n-1, one, three, two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x, char y) /* 定义move函数 */
{
printf("%c-->%c\n", x, y);
}