问题描述
简单来说,汉罗塔问题就是把A柱上的方块全部移到C柱上,每次只能移动一个盘子并且移动的过程中大的方块始终在小的方块下面。 当有n个盘子时,该如何移动?。
算法思想
这个题为什么会采用了递归的思想呢?递归的核心在于将大问题分解为若干个小问题直到达到某种可以直接解决的简单情况。那么是否可以把汉罗塔问题拆解成一个直接解决的小问题?答案是当然可以。
3号从A杆移动到C杆的过程中,A杆为起始杆,C杆是目标杆,在此之前,B杆要先暂时存放2号,才能保证3号移动到C杆,所以B杆为辅助杆
以此类推:
当移动四个方块时,从上到下(小的方块在上面)编号为别为1、2、3、4,前三个方块看出整体。则移动过程为:
1、2、3—>B,4—>C,1、2、3—>C 。
当移动五个方块时,(从上到下小的方块在上面)编号为别为1、2、3、4、5,前四个方块看出整体。则移动过程为:
1、2、3、4—>B,5—>C,1、2、3、4—>C 。
移动n个时把前n个看成整体:
前n个方块—>B,第n个方块—>C,1前n个方块—>C 。
综上所述,移动n个方块可以分解成移动前n-1个方块和移动第n个方块,前n-1个方块的移动也能分解成更小的情况。把复杂的问题简单化就是递归的思想。
代码解析
#include<stdio.h>
void move(int n,char start, char goal)
{
printf("移动%d号方块:%c—>%c ", n,start, goal);
printf("\n");
}
void hanoi(int n, char start, char assist, char goal)
{
if (n == 1)
move(n,start, goal);
/*递归的出口,只移动一个方块时,直接一步从起始杆到目标杆。
打印路程即可*/
else
{
hanoi(n - 1, start, goal, assist);
//移动多个方块时,按照上面的规律,第一步:移动前n个
move(n,start, goal);
//第二步:移动直接移动第n个到目标杆
hanoi(n - 1, assist, start, goal);
//第三步:移动辅助杆上的前n个到目标杆上
}
}
int main()
{
int n;//要移动方块的个数
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
//初始化:起始杆为A杆,辅助杆为B杆,目标杆为C杆
return 0;
}
运行结果
如果不是很理解建议画个图好好专研,一定会有所收获。很感谢您能有耐心的阅读完这篇文章。