汉诺塔c语言程序代码求移动多少次(汉诺塔次数算法c语言)

http://www.itjxue.com  2023-03-16 20:43  来源:未知  点击次数: 

用C语言代码来编写含汉诺塔问题,利用堆栈来实现.求代码

算法思想

对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

因此,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。

程序代码

#include stdio.h

int main()

{

int hanoi(int,char,char,char);

int n,counter;

printf("Input the number of diskes:");

scanf("%d",n);

printf("\n");

counter=hanoi(n,'A','B','C');

return 0;

}

int hanoi(int n,char x,char y,char z)

{

int move(char,int,char);

if(n==1)

move(x,1,z);

else

{

hanoi(n-1,x,z,y);

move(x,n,z);

hanoi(n-1,y,x,z);

}

return 0;

}

int move(char getone,int n,char putone)

{

static int k=1;

printf("%2d:%3d # %c---%c\n",k,n,getone,putone);

if(k++%3==0)

printf("\n");

return 0;

}

C语言 汉诺塔输出某一次移动方案(第n次由x移到y柱)

#includestdio.h

void hanoi(int n,char a,char b,char c);

void move(int n,char a,char b);

main()

{

int n;

printf("Input the number of disks:");

scanf("%d",n);

printf("Steps of moving %d disks from A to B by means of C:\n",n);

hanoi(n,'A','B','C');

}

void hanoi(int n,char a,char b,char c)

{

if(n == 1)

move(n,a,b);

else

{

hanoi(n-1,a,c,b);

move(n,a,b);

hanoi(n-1,c,b,a);

}

}

void move(int n,char a,char b)

{

printf("Move %d:from %c to %c\n",n,a,b);

}

//给你参考一下。

c语言编写的这个汉诺塔问题,只能算出31以内的圆盘的个数的移动次数,如何算出更多圆盘的移动次数?

应该是超过31时,数据超过了int的取值范围,换成double或者float

#include?stdio.h

float?toh(int?x)??????????//汉诺塔实现程序,主要应用函数的递归调用

{

float?f;

if(x==1)?return?f=1.0;

else?return?f=2*toh?(x-1)+1;?????//函数的递归调用

}

main()????????????????//主函数

{

???int??n;

???float?times;?????????????????//定义圆盘的个数,和次数

???printf("N:");

???scanf("%d",n);

???times=toh(n);?????????????????//函数的调用

???printf("%f\n",times);

}

c语言证明汉诺塔次数公式

c语言证明汉诺塔次数公式:f(k+1)=2*f(k)+1来计算。

#includestdio.h

usingnamespacestd

#defineMOD1000000

longlongcal(longlonga,intn,intm)

longlongans=1

a=a%m

while(n)

ans=(ans*a)%m

n=n1

a=(a*a)%m;//

returnans;

intmain(void)

intn,i,m,ans

scanf("%d",n)

while(n——)

scanf("%d",m)

printf("%lld\n",cal(2,m,MOD)-1)

return0

分析

来说明一个现象,假如A柱子上有两个大小相同的盘子,上面一个是黑色的,下面一个是白色的,我们把两个盘子移动到B上,需要两次,盘子顺序将变成黑的在下,白的在上,然后再把B上的盘子移动到C上,需要两次,盘子顺序将与A上时相同,由此我们归纳出当相邻两个盘子都移动偶数次时,盘子顺序将不变,否则上下颠倒。

用c语言编写程序求汉诺塔的移动步骤

#includestdio.h

void move(char a,char b)

{

printf("%c-%c\n",a,b);

}

void f(int n,char a,char b,char c)

{

if(n==1) move(a,c);

else

{

f(n-1,a,c,b);

move(a,c);

f(n-1,b,a,c);

}

}

void main()

{

int n;

scanf("%d",n);

f(n,'a','b','c');

}

这是我的代码 前面的是定义一个函数 这里递归体现在函数里面还有函数 于是会一次又一次的计算 直到最后把N-1以前的都移到B,最下面的移到C,再把其他的从B移到C。。 无返回的话 应该是这里用void 没有return返回数值

(责任编辑:IT教学网)

更多

推荐服务器空间文章