用非递归方式实现汉罗塔源代码.docVIP

  • 2
  • 0
  • 约3.13千字
  • 约 5页
  • 2017-09-02 发布于浙江
  • 举报
用非递归方式实现汉罗塔源代码

/* 算法描述: 要达到目的效果,只需满足 1,:奇数次移动时将最小盘子顺时针移动一下。 2:偶数次移动时将最小盘子不在的两根塔柱上的较小盘子移到另一根塔柱上。 原创 By 木全 */ #includestdio.h #includemalloc.h #includetime.h bool Isodd(int i); //判断i是否为奇数,是奇数返回true,否则返回false; bool Is_on_one_post(int** d,int n); //判断三个柱子中,是否有一根柱子已经满足移动效果了,假如满足返回ture; int findmin(int** d,int post,int n); //得到柱子号为post的柱子的最上面的盘子的编号; bool Isodd(int i)//函数实现部分; { if(i%2==1) return true; else return false; } bool Is_on_one_post(int** d,int n) { int k=0; bool post0,post1,post2;//分别有三根柱子; post0 = true; post1 = true; post2 = true; for(k=0;kn-1;k++) //用三个循环分别判断三根柱子上是否满足移动最终结果; { if(d[k+1][0]!=d[k][0]+1) { post0 = false; break; } } for(k=0;kn-1;k++) { if(d[k+1][1]!=d[k][1]+1) { post1 = false; break; } } for(k=0;kn-1;k++) { if(d[k+1][2]!=d[k][2]+1) { post2 = false; break; } } if(post0 || post1 || post2) //任一存在一根柱子满足,则返回真; return true; else return false; } int findmin(int** d,int post,int n) { int k=0; for(k=0;kn;k++) if(d[k][post]!=0) return k; //找到第post号柱子上的最上面的盘子编号;并返回 return -1; //假如柱子为空,则返回-1; } int main() { int **d; int step,min,n,i; clock_t start, finish; double duration; printf(Input the number of dishs!\n); scanf(%d,n); start = clock(); // 开始计算时间; d = (int**)malloc(n*sizeof(int*)); for(i=0;in;i++) d[i] = (int*)malloc(3*sizeof(int)); // 动态分配一个二维数组,行数为盘子数,列数为柱子数; for(i=0;in;i++) // 对二维数组初始化,将所有盘子放在第0跟柱子上,然后其他两跟柱子上全清零; { d[i][0] = i+1; d[i][1] = 0; d[i][2] = 0; } step = 1; min =0; d[0][min+1] = d[0][min]; //第一次移动盘子,将0号柱子上的1号盘子移到1号柱上; d[0][min] = 0; // 移动完后立即清零,方便以后判断柱子是否为满足最终移动条件; printf(%d post --- %d post!\n,min,min+1); //从此以后,每移动一次,就得打印一次; step++; min++; while(!Is_on_one_post(d,n)) //以下才是本程序的重点,慢慢判断,慢慢输出; { if(Isodd(step)) //如果是第奇数次移动;只需将最小盘子顺时针移动一个; { d[0][(min+1)%3] = d[0][min%3]; d[0][min%3] = 0; printf(%d post --- %d post!\n,min%3,(min+1)%3); min++; //min就是最小盘子所在柱子的编号; } else // 当为偶数次移动时; { int lay1,lay2; lay1 = findmin(d,(min-1)%3

文档评论(0)

1亿VIP精品文档

相关文档