资源描述
有3个塔,每个都可以对方若干个盘子。开始时,所有盘子均在塔A上,应且,盘从上到下,按直径增大的次序放置(如图所示)。设计一个移动盘子的程序,使得塔A上的所有盘子借助于塔B移到塔C上,但有两个限制条件:一是一次只能搬到一个盘子,而是任何时候不能大盘子放在比它小的盘子的上面。
程序如下:
#include<stdio.h>——————不解释
int step=0;—————————赋初值
move(int n,char a,char b,char c);——函数声明
main()——————————不解释
{
int n;——————————不解释
scanf("%d",&n);——————不解释
printf("n=%d\n",n);—————不解释
move(n,'a','b','c');——————调用函数move
return 0;—————————不解释
}
move(int n,char a,char b,char c)————不解释
{
if(n>0)
{
move(n-1,a,c,b);
step++;
printf("step%d:%c-->%c\n",step,a,c);
move(n-1,b,a,c);
}
}
现在开始详解:
现在开始解释move在main函数的具体发挥。
设n=3只有3个盘子
move(int 3,char a,char b,char c) ————n=3
{
if(3>0)————n变为3
{
move(2,a,c,b);————n减1变为2
//////step++;
printf("step%d:%c-->%c\n",step,a,c);\\\\\注意斜杠里是个整体,不是分开讨论的。
move(n-1,b,a,c);
}
1,move(n,a ,b,c)表示讲n个盘子从A塔(借助于B塔)移到C塔。
所以move(3,a ,b,c)表示讲3个盘子从A塔(借助于B塔)移到C塔。
2,move(2,a,c,b):即讲2个盘子从A塔(借助于C塔)移到B塔。目的是让A塔上第3个盘子(最下面的盘子)上无其他盘子。
3,将底下的第3个盘子从A塔移到C塔。
4,move(2,b,a,c):即将2个叠放在B塔上的盘子(借助于A塔)移到C塔。
printf("step%d:%c-->%c\n",step,a,c)这个代码就是打印这里。
然后关键来了
move(2,b,a,c)就要调move(n,chara, charb, charc)函数了,这里请注意char a只是一个字符变量,就是一个只能赋值字符的变量,它现在对应的是b,同理charb对应a,charc对应a,这样下去就一目了然了
展开阅读全文