首页 > 进阶的汉诺塔

汉诺塔,进阶的汉诺塔

互联网 2021-04-17 00:48:10

在讲解递归时,汉诺塔游戏是一个非常经典的例子。

有三根针A、B、C。A针上有64个盘子。盘子大小不等。大的在下小的在上。要求将多个盘子从A针移到C针。要求:可以借助B针,每次只许移动一个盘子。三根针上始终保持大盘在下小盘在上,要求编程求出移动的步骤。

因此,三个步骤可分成两类操作:

(1)将 n-1个盘从一个针移到另一个针(n>1), 是一个递归过程;

(2)将一个盘从一个针移到另一个针上。

分别用两个函数实现以上两个操作:

1.hanoi(n,one,two,three)表示将n个盘从one针借助two 移到three针

2.move(getone,putone) 表示将一个盘从getone针移到putone针.

注:one,two,three,getone,putone都代表A、B、C之一,根据各次不同情况取A、B、C代入。

第一个版本的汉诺塔代码如下:

#includevoid move(char x, chary){ printf("Move%c to %c \n ", x,y);}//////////////////////////////void hanoi(int n,char A,char B,char C){ if(n==1) move(A,C); else { hanoi(n-1,A,C,B); move(A,C); hanoi(n-1,B,A,C); }}int main(){ int n; printf("Input number of plates!"); scanf("%d",&n); hanoi(n,'A','B','C'); return 0;}

三个盘子的汉诺塔问题输出结果为:

然而这个版本只能实现一些移动步骤的文字提示,不直观。

应用清屏函数和字符显示,同学们实现了第二个版本的汉诺塔:

#include#include#include #include void move(char x,char y,int n, int **p);void hanoi(int n,char one,char two,char three, int **p);void changeshuzu(char x,char y,int n, int **p);void changehigh(char x,char y);/////改变塔高void print(int**p);///////输出起始塔void printstar(int **p);////void gotoxy(int x,int y) ;///光标回到原位置static int higha,highb,highc,r,c;//high 高度,int main(){ int i; int **p; printf("input a number:"); scanf("%d",&r); c=r*10; p = new int* [r];//动态分配二维数组 p[0] = new int[r * c]; for(i = 1; i
免责声明:非本网注明原创的信息,皆为程序自动获取自互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件24小时内删除。