重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先我们要了解这个游戏,汉诺塔问题,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
宽城ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
先将A -- C,再将A -- B,因为汉诺塔是下面的圆盘(第二个)比上面的大(第一个),所以我们不能直接放在第三根柱子即A上,紧接着当我们想要移动第三个圆盘di时已经没有柱子了,所以我们先将C柱上的圆盘给B,再将A柱上的圆盘给C即A -- C,此时C上是第三大的圆盘,B上从上到下依此是第一个和第二个盘子,然后再将B -- A(最小号盘子给A),然后B -- C(第二大的盘子给C),再将最小盘子给C即A -- C,这是实现前三个盘子放置方法。
建议你找个小游戏玩一下,一边玩一边理解。
首先调用 hanoi(3,a,b,c)
判断 “3”是否为“1”
不为“1”
{
{ 调用 hanoi(n-1, one, three, two),即hanoi(2,a,c,b)
执行hanoi(2,a,c,b),此时 one = a,two = c,thtee = b;
判断 “2”是否为“1”,不为1
调用 hanoi(n-1, one, three, two),即hanoi(1,a,b,c)
执行hanoi(1,a,b,c),此时 one = a,two = b,thtee = c;
判断 “1”是否为“1”,为1,执行move(one, three)即move(a, c)
以上为循环执行hanoi(n-1, one, three, two)函数,直到“n==1”
}
执行move(one, three);
执行hanoi(n-1, two, one, three)
{
循环执行hanoi(n-1, two, one, three),直到“n==1”
}
}
主要是递归的用法
好像解释的不太清楚,但希望能帮到你。
将以下内容全部复制到新建的源文件中:(本人自己写的,因为你那课本上的代码,没解释,书写不规范,很难理解清楚,所以我直接新写了一个完整的代码,附带详细说明)
#include stdio.h
//汉诺塔x层塔从A塔整体搬到C塔,中间临时B塔。
//x层塔是从大到小往上叠放。每次移动只能移动一层塔。并且在移动过程中必须保证小层在上边
//借助B塔可以将x层塔全部从A搬到C上,并且符合要求(在移动过程中大的那块在下边,小的那块在上边)
int main()
{
void tower(int x,char a,char b,char c); //声明函数
int x=5,a='A',b='B',c='C'; //x表示有5层塔,具体要多少层自己修改这个值。abc分别表示ABC塔。
tower(x,a,b,c); //x层塔从a移动到c的全过程,主程序只有这条有效语句
return 0;
}
//以下是tower函数的定义
//参数解析:x层塔放在a上,b是中间塔,c是目标塔。即x层塔要从a搬到c上。
//此函数实现x层塔从a整体转移到c上。以及这个过程是怎么搬的全部过程。
void tower(int x,char a,char b,char c)
{
if(x==1)printf("将%d从%c放到%c\n",x,a,c); //只有1层塔时,直接从a搬到c上。
else //不止1层塔,则先将x-1层塔从a按照规律搬到b上,再将最后一块从a搬到c上,最后再将b上的x-1层塔按照规律搬到c上。
{
tower(x-1,a,c,b); //先将x-1层塔从a按照规律搬到b上,注意参数b放在最后,因为放在最后的参数是准备搬过去的目标塔。
printf("将%d从%c放到%c\n",x,a,c); //将最后一块从a搬到c上
tower(x-1,b,a,c); //最后再将b上的x-1层塔按照规律搬到c上,注意参数b放在开头,因为x-1层是要从b上搬过去的。
}
}
#includestdio.h
void move(int n,char a,char b,char c)
{
if(n==1)
printf("\t%c-%c\n",a,c); //当n只有1个的时候直接从a移动到c
else
{
move(n-1,a,c,b); //第n-1个要从a通过c移动到b
printf("\t%c-%c\n",a,c);
move(n-1,b,a,c); //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解
}
}
main()
{
int n;
printf("请输入要移动的块数:");
scanf("%d",n);
move(n,'a','b','c');
}