http://acm.hdu.edu.cn/showproblem.php?pid=2184 acm

来源:百度知道 编辑:UC知道 时间:2024/05/14 14:27:41
http://acm.hdu.edu.cn/showproblem.php?pid=2184
这道汉诺塔问题提问~~有谁知道呢~~就讲个思路就行
wonder想知道 你这个不行哦~~~当盘数过于大的时候你的算法就超时~~你的算法只是普通的汉诺塔递归算法`~在这基础上修改了一下而已~`不行哦

/*本程序以 4个盘子、走5步 为例*/

#include <stdio.h>
#include <stdlib.h>
void hanoi(int a[],int b[],int c[],int n,double *m)
/*数组a[],b[],c[]分别代表三根柱子,第0个元素存放本柱子上的盘子数目,其余元素存放盘子编号,例如a[0]存放的是第一根柱子上的盘子数目。n是总盘子数目,m指针所指向的单元存放需要走的步数*/
{
if(*m>0&&n>0)
{
hanoi(a,c,b,n-1,m);
if(*m>0)
{
c[++c[0]]=a[a[0]--];
(*m)--;
}
hanoi(b,a,c,n-1,m);
}
}

void main()
{
int a[100];
int b[100];
int c[100];
int n;
double *m;
int i;
/*以 4个盘子、走5步 为例*/
a[0]=4;
b[0]=0;c[0]=0;
n=a[0];
m=(double*)malloc(sizeof(double));
*m=5;
/*a[]存放盘子编号*/
for(i=1;i<=a[0];i++)
a[i]=a[0]-i+1;

hanoi(a,b,c,n,m);

/*输出*/
for(i=0;i<=a[0];i++)
printf(" %d",a[i]);
printf("\n");

for(i=0;i<=b[0];i++)
printf(" %d",b[i