#include<stdio.h>
int step=0; //全局变量step用于统计步数
int main()
{
int left[5]={1,2,3,4,5};
int mid[5]={0},right[5]={0}; //用三个数组模拟三个柱子,5个数字表示由大到小的5个盘子
int steps;
int hanoi_com(int n,int a[5],int b[5],int c[5]);
steps=hanoi_com(5,left,mid,right,0);
printf("left=[%d,%d,%d,%d,%d]\n",left[0],left[1],left[2],left[3],left[4]);
printf("mid=[%d,%d,%d,%d,%d]\n",mid[0],mid[1],mid[2],mid[3],mid[4]);
printf("right=[%d,%d,%d,%d,%d]\n",right[0],right[1],right[2],right[3],right[4]); //打印最终状态
printf("steps=%d\n",steps); //打印结果
return 0;
}
int hanoi_com(int n,int a[5],int b[5],int c[5])
{
int i,aofe_a,aofe_c;
if(n==1)
{
i=0;
while(i<=4)
{
if(a[i]!=0) break;
else i++;
}
aofe_a=i; //统计柱子a的空位数
i=0;
while(i<=4)
{
if(c[i]!=0) break;
else i++;
}
aofe_c=i; //统计柱子c的空位数
c[aofe_c-1]=a[aofe_a];
step=step+1;
a[aofe_a]=0; //进行一次变换并记录
}
//三步法
else
{
hanoi_com(n-1,a,c,b);
i=0;
while(i<=4)
{
if(a[i]!=0) break;
else i++;
}
aofe_a=i;
i=0;
while(i<=4)
{
if(c[i]!=0) break;
else i++;
}
aofe_c=i;
c[aofe_c-1]=a[aofe_a];
step=step+1;
a[aofe_a]=0;
hanoi_com(n-1,b,a,c);
}
return step;
}
经典汉诺塔问题通过简单的递归法计算完成步数,本文以5个盘子为例,用数组模拟汉诺塔问题实现的过程(c语言实现),思想还是传统的“三步法”。
以上代码经过加工后还可实现对每一次变换的显示,本文暂不贴出,如感兴趣可自己尝试。