新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先我们要了解这个游戏,汉诺塔问题,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
网站建设哪家好,找创新互联公司!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了弥勒免费建站欢迎大家使用!
先将A -- C,再将A -- B,因为汉诺塔是下面的圆盘(第二个)比上面的大(第一个),所以我们不能直接放在第三根柱子即A上,紧接着当我们想要移动第三个圆盘di时已经没有柱子了,所以我们先将C柱上的圆盘给B,再将A柱上的圆盘给C即A -- C,此时C上是第三大的圆盘,B上从上到下依此是第一个和第二个盘子,然后再将B -- A(最小号盘子给A),然后B -- C(第二大的盘子给C),再将最小盘子给C即A -- C,这是实现前三个盘子放置方法。
建议你找个小游戏玩一下,一边玩一边理解。
这是一个递归的算法。
第一步,n-1个金片从a经c移动到b
不是“一步”完成的,而是“一个阶段”(一次递归调用)完成的。
在假定它完成的基础上,第二步就可以完成了。
在上面两步完成的基础上,第三步,n-1个金片从b经a移动到c,完成后全部工作就完成了。
========
至于“n-1个金片从a经c移动到b”是怎么完成的,这就要“老和尚给小和尚讲故事”了:
第一步,先移动n-2个金片,再移动第n-1个金片,最后把n-2个金片移动到位。
#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');
}
//代码如下:
//说明:A,B,C为三个载体,起始,中间,目的载体为相对的,
//1.将n-1个盘子从起始载体通过目的载体,移动到中间载体
//2.只有最后一个盘子了.你需要将最后一个盘子从起始载体移到目的载体即可
//3.再将n-1个盘子从刚才的中间载体通过起始载体移动到目的载体.完成
//4.在递归时遇到只有1个盘子那直接从起始介质移到目的介质就OK了.
//自己用纸画画吧,不太好理解.明白了就不难了.
#include
#define
DISKA
"A"
#define
DISKB
"B"
#define
DISKC
"C"
void
move(int
num,char
*fromp,char
*mediump,char
*top);
void
mv(char
*fp,char
*tp);
int
main()
{
printf("please
input
the
num
of
disk:");
int
num;
scanf("%d",num);
move(num,DISKA,DISKB,DISKC);
return
0;
}
void
move(int
num,char
*fromp,char
*mediump,char
*top)
{
if(num
==
1)
{
mv(fromp,top);//4
}
else
{
move(num-1,
fromp,
top,
mediump);//1
mv(fromp,top);//2
move(num-1,
mediump,
fromp,
top);//3
}
}
void
mv(char
*fp,char
*tp)
{
printf("%s---%s\n",fp,tp);
}
见代码注释,还有不懂可以问。
#include stdio.h
void move(char x,char y)
{
printf("%c--%c\n",x,y);
}
//hannuota函数的作用:把n个圆盘从one柱子借助two柱子放到three柱子
void hannuota(int n,char one,char two,char three)
{
if(n==1)//如果只有一个柱子
move(one,three);//直接移动即可
else
{
hannuota(n-1,one,three,two);//先把one柱子上的n-1个圆盘借助three柱子移动到柱子two
move(one,three);//把第一个柱子的剩下那一个(第n个)移动到第三个柱子
//由于原来one柱子上的n-1个圆盘已经移动到了two柱子上,因此不会有圆盘挡住n圆盘出来
hannuota(n-1,two,one,three);
//最后再把那n-1个圆盘从two柱子借助one柱子移动到three柱子
//(上面第一句话hannuota(n-1,one,three,two)已经移动到了two柱子,因此这里是从two柱子移动到three柱子)
}
}
int main()
{
int m;
printf("input the number of diskes:");
scanf("%d",m);
printf("The step to move %d diskes:\n",m);
hannuota(m,'A','B','C');
return 0;
}