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

来源:互联网 发布:软件设计师培训学校 编辑:程序博客网 时间:2024/04/29 11:19

问题:

三根柱子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


0 0
原创粉丝点击