c语言经典问题:汉诺塔 Hanoi问题

问题:

三根柱子A,B,C.其中A上有n个直径递增的圆盘(最顶为最小,然后往下一次增大),现在要把A上的n个圆盘移到C上,要求每次移动一个,不允许出现任何大的圆盘叠放在小的圆盘上,柱B可作中转用。求移动步骤。

这个问题使用递归思想是比较靠谱的,能大大降低难度。c语言代码如下:

//  Created by zyb on 14-6-23.
// All rights reserved.

#include <stdio.h>
void m(int n,char x,char y,char z);//声明函数m,函数的四个参数中,n代表汉诺塔的层数,x、y、z代表从将n层汉诺塔从x移动到z,y为中间介质。
void m(int n,char x,char y,char z){
    if (n==1) {           //如果只有一个需要移动,直接输出
        printf(“%c–>%c\n”,x,z);
    }
    else{               //如果有n>1个需要从x移动z,将x最上面的n-1个移动到y,将最后一个移动到z,最后利用递归。将y上面的n-1个移动到z。
        m(n-1,x, z, y);
        printf(“%c–>%c\n”,x,z);
        m(n-1, y,x,z);
    }
}
int main(){
    int n=0;
    printf(“请输入汉诺塔的层数:”);
    scanf(“%d”,&n);
    m(n, ‘A’, ‘B’, ‘C’);
}

运行,输入6,结果如下:

请输入汉诺塔的层数:6
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
A–>C
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
C–>A
B–>C
B–>A
C–>A
C–>B
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
A–>C
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C
B–>A
C–>A
C–>B
A–>B
C–>A
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C
A–>B
C–>A
C–>B
A–>B
A–>C
B–>C
B–>A
C–>A
B–>C
A–>B
A–>C
B–>C

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/zhaoyabei/article/details/34109413
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞