HANOI塔問題是《數(shù)據(jù)結(jié)構(gòu)》中用來介紹遞歸算法的最典型的例題。
本程序可同時(shí)將HANOI塔問題的解題步驟的中間結(jié)果顯示在屏幕上和保存在文本文件中。(后一點(diǎn)對(duì)于顯示結(jié)果很多無法在一屏中顯示時(shí),特別有用)
程序思路很簡(jiǎn)單,看注釋就明白了。
/*
Name: hanoi2.c
Author: zhuqing
Description: HANOI塔問題的遞歸解
Date: 06-08-03 11:44
Copyright:
*/
#include
#define N 5
/* 原柱,中間柱,目標(biāo)柱初值數(shù)組 */
char a[]={'1','2','3','4','5'};
char b[]={'0','0','0','0','0'};
char c[]={'0','0','0','0','0'};
int step=0;
main()
{
FILE *fp;
int i;
if((fp=fopen("c:\\hanoi2.txt","w"))==NULL){
printf("\nCannot open the file!\n");
getch();
exit(0);
}
printf("\n============ HANOI TOWER ============\n");
print(N);
fprint(N,fp);
move(N,a,b,c,fp);
fclose(fp);
getch();
}
/* 遞歸函數(shù) */
void move(int n,char a[],char b[],char c[],FILE* fp)
{
if(n>0){
move(n-1,a,c,b,fp);
c[n-1]=a[n-1];
a[n-1]='0';
print(N);
fprint(N,fp);
move(n-1,b,a,c,fp);
}
}
/* 打印輸出結(jié)果到屏幕的函數(shù) */
void print(n)
int n;
{
int i;
printf("\nSTEP%d",step++);
printf("\na:");
for(i=0;i printf("%3c",a[i]);
printf("\nb:");
for(i=0;i printf("%3c",b[i]);
printf("\nc:");
for(i=0;i printf("%3c",c[i]);
printf("\n-------------------------------------\n");
}
/* 打印輸出結(jié)果到文本文件的函數(shù) */
void fprint(n,fp)
int n;
FILE *fp;
{
int i;
fputs("\na:",fp);
for(i=0;i fputc(a[i],fp);
fputs("\nb:",fp);
for(i=0;i fputc(b[i],fp);
fputs("\nc:",fp);
for(i=0;i fputc(c[i],fp);
fputs("\n-------------------------------------\n",fp);
}
本程序可同時(shí)將HANOI塔問題的解題步驟的中間結(jié)果顯示在屏幕上和保存在文本文件中。(后一點(diǎn)對(duì)于顯示結(jié)果很多無法在一屏中顯示時(shí),特別有用)
程序思路很簡(jiǎn)單,看注釋就明白了。
/*
Name: hanoi2.c
Author: zhuqing
Description: HANOI塔問題的遞歸解
Date: 06-08-03 11:44
Copyright:
*/
#include
#define N 5
/* 原柱,中間柱,目標(biāo)柱初值數(shù)組 */
char a[]={'1','2','3','4','5'};
char b[]={'0','0','0','0','0'};
char c[]={'0','0','0','0','0'};
int step=0;
main()
{
FILE *fp;
int i;
if((fp=fopen("c:\\hanoi2.txt","w"))==NULL){
printf("\nCannot open the file!\n");
getch();
exit(0);
}
printf("\n============ HANOI TOWER ============\n");
print(N);
fprint(N,fp);
move(N,a,b,c,fp);
fclose(fp);
getch();
}
/* 遞歸函數(shù) */
void move(int n,char a[],char b[],char c[],FILE* fp)
{
if(n>0){
move(n-1,a,c,b,fp);
c[n-1]=a[n-1];
a[n-1]='0';
print(N);
fprint(N,fp);
move(n-1,b,a,c,fp);
}
}
/* 打印輸出結(jié)果到屏幕的函數(shù) */
void print(n)
int n;
{
int i;
printf("\nSTEP%d",step++);
printf("\na:");
for(i=0;i
printf("\nb:");
for(i=0;i
printf("\nc:");
for(i=0;i
printf("\n-------------------------------------\n");
}
/* 打印輸出結(jié)果到文本文件的函數(shù) */
void fprint(n,fp)
int n;
FILE *fp;
{
int i;
fputs("\na:",fp);
for(i=0;i
fputs("\nb:",fp);
for(i=0;i
fputs("\nc:",fp);
for(i=0;i
fputs("\n-------------------------------------\n",fp);
}