版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
程序演示过程如图所示: