汉诺塔问题的非递归实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汉诺塔问题的非递归实现

#include

#include

#include

//第0位置是柱子上的塔盘数目

int zhua[100]={0},zhub[100]={0},zhuc[100]={0};

char charis(char x,int n)

//左右字符出现顺序固定,且根据n值奇偶而不同

{

switch(x)

{

case 'A':

return (n%2==0)?'C':'B';

case 'B':

return (n%2==0)?'A':'C';

case 'C':

return (n%2==0)?'B':'A';

default:

return '0';

}

}

void print(char lch,char rch)

//打印字符

{

if(lch=='A')

{

switch(rch)

{

case 'B':

zhub[0]++;

zhub[zhub[0]]=zhua[zhua[0]];

zhua[zhua[0]]=0;

zhua[0]--;

break;

case 'C':

zhuc[0]++;

zhuc[zhuc[0]]=zhua[zhua[0]];

zhua[zhua[0]]=0;

zhua[0]--;

break;

default:

break;

}

}

if(lch=='B')

{

switch(rch)

{

case 'A':

zhua[0]++;

zhua[zhua[0]]=zhub[zhub[0]]; zhub[zhub[0]]=0;

zhub[0]--;

break;

case 'C':

zhuc[0]++;

zhuc[zhuc[0]]=zhub[zhub[0]]; zhub[zhub[0]]=0;

zhub[0]--;

break;

default:

break;

}

}

if(lch=='C')

{

switch(rch)

{

case 'A':

zhua[0]++;

zhua[zhua[0]]=zhuc[zhuc[0]]; zhuc[zhuc[0]]=0;

zhuc[0]--;

break;

case 'B':

zhub[0]++;

zhub[zhub[0]]=zhuc[zhuc[0]]; zhuc[zhuc[0]]=0;

zhuc[0]--;

break;

default:

break;

}

}

printf("\t");

int i;

printf("(");

for(i=1;i<=zhua[0];i++)

printf(" %d ",zhua[i]);

printf(")");

printf("(");

for(i=1;i<=zhub[0];i++)

printf(" %d ",zhub[i]);

printf(")");

printf("(");

for(i=1;i<=zhuc[0];i++)

printf(" %d ",zhuc[i]);

printf(")");

printf("\n");

}

void Hannuo(int n)

{

//分配2^n个空间

bool *isrev;

isrev=(bool *)malloc(sizeof(bool)*(int)pow(2,n));

for(int i=1;i

isrev[i]=false;

//循环计算是否逆序

for(int ci=2;ci<=n;ci++)

{

for(int zixh=(int)pow(2,ci-1);zixh

isrev[zixh]=isrev[(int)pow(2,ci)-zixh];

//该位置为中间位置,且奇次幂逆序,偶数幂不逆序

isrev[(int)pow(2,ci)]=((ci-1)%2==0)?false:true;

}

char lch='A',rch;

rch=(n%2==0?'B':'C');

printf("%d\t",1);

printf("%c->%c",lch,rch);

print(lch,rch);

for(int k=2;k

{

if(k%2==0)

rch=charis(lch,n);

else

lch=charis(rch,n);

printf("%d\t",k);

if(isrev[k])

相关文档
最新文档