汉诺塔问题的非递归非堆栈算法(一)

王朝other·作者佚名  2006-01-08
宽屏版  字体: |||超大  

#include <iostream.h>

#include <math.h>

#define maxno 10000

int step_d,step_s,no;//定义将要行进的步数

void main()

{

cout<<"请输入数字(1-64):";

cin>>no;//获取实际的塔片数

//初始化

int **p=new int*[3];

p[0]=new int[no+1];

p[1]=new int[no+1];

p[2]=new int[no+1];

p[0][0]=maxno;p[1][0]=maxno;p[2][0]=maxno;

for(int count=1;count<=no;count++)

{

p[0][count]=no-count+1;

p[1][count]=0;

p[2][count]=0;

}

//初始化完毕

if(fmod(no,2)){step_s=2;step_d=1;}else {step_s=1;step_d=2;}//判断奇数盘的步数和偶数盘的步数

int from,to;

from=0;

to=step_s+from;

p[0]=&p[0][no];

while(*(p[0]) != *(p[1]))

{

cout<<"从柱:"<<from+1<<" 到柱: "<<to+1<<endl;

*(++p[to])=*(p[from]);

*(p[from]--)=0;

//以下求得下一步将要From移动的柱子

switch(to)

{

case 2:

if(*(p[0]) < *(p[1]))from=0;else from=1;

break;

case 1:

if(*(p[0]) < *(p[2]))from=0;else from=2;

break;

case 0:

if(*(p[2]) < *(p[1]))from=2;else from=1;

break;

}

//以下一行求得下一步将要移动到的柱子

if(fmod(*(p[from]),2))to=fmod(from+step_s,3);else to=fmod(from+step_d,3);

}

char c;

cin>>c;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有