Hanoi塔问题的编程解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Stynis/article/details/80537141

      汉诺塔是一个比较经典的问题,有许多的资料可供参考,此处只做简略描述。需要详细了解的读者可以参考网上的其他资料。这里使用调用的方法实现问题的解决。
      汉诺塔问题可以视为将n号盘子之上的所有盘子搬到c轴上,把n号盘子搬到b轴上,再把n-1个盘子从c轴上搬回到a轴上的问题。其中将n-1个盘子搬出去的操作与将n-1个盘子搬回来的操作实际上是一个盘子个数为n-1,改变了a,b,c轴的汉诺塔问题,则可以通过递归调用自身实现,递归出口为n=1时将盘子从a搬到b.

编写代码如下:
hanoi.h

static int j = 0;
static int i = 1;
void move(char x, int n, char z);
void hanoi(int n, char x, char y, char z);
void restartij();

hanoi.c

#include"hanoi.h"
void move(char x, int n, char z) {
    printf("%d.Move disk %d from %c to %c\n", ++j, n, x, z);
}
void hanoi(int n, char x, char y, char z) {
    printf("现在为第%d层\n", i); 
    if (n == 1)
        move(x, 1, z);
    else {
        i++;printf("调用第一个递归进入第%d层\n", i); 
        hanoi(n - 1, x, z, y);  //把上面的n-1个盘子从x移动到y上
        i--; printf("调用结束,返回至第%d层\n",i);
        move(x, n, z);          //把最下面的第n个盘子从x移动到z上
        i++; printf("调用第二个递归进入第%d层\n", i);
        hanoi(n - 1, y, x, z);  //把n-1个盘子从y上移回到x上
        i--; printf("调用结束,返回至第%d层\n", i);
    }
}
void restartij() {
    j = 0; i = 1; 
}

Main.c

#include<stdio.h>
#include<stdlib.h>
#include"hanoi.h"
int main(){
    int n;
    while(1){
        printf("intput the number of the disk:");
        scanf("%d", &n);
        if (n == 0)break;
        printf("the steps for %d disk are: \n", n);
        hanoi(n, 'a', 'b', 'c');
        restartij();
        printf("\n");
    }
    system("pause");
    return 0;
}

程序演示过程如图所示:


Hanoi

猜你喜欢

转载自blog.csdn.net/Stynis/article/details/80537141