汉诺塔问题的C语言程序应该怎么写?并请说明一下原因

 我来答
逸风舞
2016-05-11 · TA获得超过152个赞
知道小有建树答主
回答量:100
采纳率:0%
帮助的人:94.3万
展开全部
其实主要就是三个步骤:
第一,把a上的n-1个盘通过c移动到b。
第二,把a上的最下面的盘移到c。
第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。



#include<stdio.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
    }
}
 
int main()
{
    int n;
    printf("请输入要移动的块数:");
    scanf("%d",&n);
    move(n,'a','b','c');
    return 0;
}
更多追问追答
追问
move(n-1,a,c,b);            //第n-1个要从a通过c移动到b
printf("\t%c->%c\n",a,c);
move(n-1,b,a,c)
这一部分怎么理解?
追答

你可以简单的理解成:

  1. 首先我要把上边n-1个盘子全部从a借助c移动到b上

  2. 这样a上还有一个最大的,c上没有,就可以把a上这个移到c上了

  3. 这样是不是和原始状态一致了呢?相当于b是原始的a了

  4. 因为每一次都是递归执行的,当 move(n-1,a,c,b);   printf("\t%c->%c\n",a,c);执行完之后就已经做到了上述2的状态,那下一步要做的就是把n-1个从b借助a移到c上,让所有的盘子都在c上

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式