/**
汉诺塔的研究
A,B,C,将A上的盘子移到C上,规则不再多说
经典的递归:
确立目标:A上的盘子移动到C上
问题分解:1, A--->B(借助于C将A的n-1个盘子移动到B上) 2, B--->C(借助于A将B的n-1个盘子移动到C上)
递归的边界:A上的最后一个直接放到C上
*/
#include<stdio.h>
///目标:将n个盘子从x,借助y,移动到z
void move(int n, char x, char y, char z)
{
if(n == 1)///递归边界:剩一个的时候直接放到 z 就可以了 这是对第n个盘子进行操作
{
printf("%c--->%c\n",x,z);
}
else
{
/**该函数到达边界后并没有完成将A上的盘子移动到
B上,而是在回溯的过程中配合第二个递归调用才真正一步一步完成的
塔的移动,只是问题可以这么分解,这是难点,很难理解,很难拿来使用
*/
move(n-1, x, z, y); ///问题分解1:将n-1个盘子从x借助z移动到y
printf("%c--->%c %d\n",x,z,n); ///将第n个盘子从x移动到z上
move(n-1, y, x, z); ///问题分解2:将n-1个盘子从y借助x移动到z
}
}
int main()
{
int n;
scanf("%d",&n);
move(n, 'x', 'y', 'z');
return 0;
}
汉诺塔
最新推荐文章于 2024-08-07 20:15:08 发布