在讲解递归时,汉诺塔游戏是一个非常经典的例子。
有三根针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代入。
第一个版本的汉诺塔代码如下:
#include<stdio.h>
void move(char x, char y)
{
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<stdio.h>
#include<stdlib.h>
#include <ctime>
#include <windows.h>
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 < r; i++)//动态分