您的位置:首页 > 其它

汉诺塔

2015-08-09 21:07 267 查看
/**
汉诺塔的研究
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: