⑴ 汉诺塔c语言算法。注意是算法
void hanoi (int n; char x, char y,char z)
/* 将塔座x上按直径由小到大且至上而下编号为1至n的
n个圆盘按规则搬到塔座z上,y可用作辅助塔座。*/
1 {
2 IF (n==1)
3 move(x, 1, z); /*将1号盘从x移到z*/
4 ELSE {
5 hanoi(n-1, x, z, y); /*将x上n-1个盘移到y, z作辅助塔*/
6 move(x, n, z); /*将n号圆盘从x移到z*/
7 hanoi(n-1, y, x, z); /*将y上n-1个盘移到z, x作辅助塔*/
8 }
}
⑵ 关于c语言的汉诺塔应用
这样跟你说吧,如果搬3个盘子就要搬七次,四个盘子就是十五次。
公式是:pow(2,n)-1;//n代表一共有几个盘子
⑶ c语言汉诺塔.
# include <stdio.h>
void hannuota(int n,char A,char B, char C);
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("请输入要移动的盘子的个数:");
scanf("%d",&n);
hannuota(n,'A','B','C');
return 0;
}
//将A柱子上的n个盘子借助于B移动到C柱子上,
//每次移动时,必须保证大盘子在小盘子下面
//最大值不能是64
void hannuota(int n,char A,char B,char C)
{
/*
如果是1个盘子
直接将A柱子上的盘子从A移动到C
否则
先将A柱子上的n-1个盘子借助于C从A移动到B
直接将A柱子上的盘子从A移动到C
最后将B柱子上的n-1个盘子借助于A从B移动到C
*/
if (1 == n)
{
printf("将编号为%d的盘子从%c柱子移动到%c柱子\n",n,A,C);
}
else
{
hannuota(n-1,A,C,B);
printf("将编号为%d的盘子从%c柱子移动到%c柱子\n",n,A,C);
hannuota(n-1,B,A,C);
}
}
/*
在vc++6.0中的输出结果:
------------------
请输入要移动的盘子的个数:3
将编号为1的盘子从A柱子移动到C柱子
将编号为2的盘子从A柱子移动到B柱子
将编号为1的盘子从C柱子移动到B柱子
将编号为3的盘子从A柱子移动到C柱子
将编号为1的盘子从B柱子移动到A柱子
将编号为2的盘子从B柱子移动到C柱子
将编号为1的盘子从A柱子移动到C柱子
-------------------
*/
/*
供参考! 呵呵
*/
⑷ 求救c语言(4柱子汉诺塔问题)是高手就来
汉诺塔问题用递归很容易就解决了,否则太麻烦了,你可以用递归试试
⑸ 汉诺塔n=4(4个盘)c语言递归编程代码
/****************************
汉诺塔的算法就3个步骤:
第一,把a上的n-1个盘通过c移动到b。
第二,把a上的最下面的盘移到c。a成了空的。
第三,因为n-1个盘全在b上了,所以把b当做a.
重复以上步骤就好了。所以算法看起来就简单多了。
******************************/
#include<stdio.h>
staticintm=0;
voidmove(intn,chara,charb,charc)
{
if(n==1)
{
m++;
printf("第%d次移动: ",m);
printf(" %c->%c ",a,c);//当n只有1个的时候直接从a移动到c
}
else
{
move(n-1,a,c,b);//第n-1个要从a通过c移动到b
m++;
printf("第%d次移动: ",m);
printf(" %c->%c ",a,c);
move(n-1,b,a,c);//n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解
}
}
intmain()
{
intn=4;
//printf("请输入要移动的块数:");
//scanf("%d",&n);
move(n,'a','b','c');
return0;
}
⑹ C语言汉诺塔(高分提问)
其实汉诺塔就是递归问题,你理解了递归思想,自然就很容易懂,这种问题一般都作为编程语言教程的递归例子讲解的,你其实可以仔细看看课本的.
hanio(n-1,a,c,b);// 这语句的意思是:首先将a 上面的n-1个盘通过c 移动到b ,这样的结果是,a 只剩下最大一块盘,然后直接移动到c就行了,所以也就有move(a,c); 之后a 为空,b 有刚才移动的n-1个盘,c 上面已经有个最大的了,如果把剩下的n-1移动到c ,就完成了,所以接着有下面的语句:
hanio(n-1,b,a,c); //这意思说,把b 上的n-1个盘通过a 移动到c,
就这样完成递归,一次次执行下去,就行了.
⑺ C语言汉诺塔怎么理解拜托各位大神
首先你得明白这是用函数递归调用的方法,递归就不用我说了,看代码
void
hanoi(int
n,char
one,char
two,char
three)
{
void
move(char
x,char
y);
if(n==1)
move(one,three);
//这个if语句,当盘子只有一个的时候,当然直接从第一根柱子(one)移到第//三根柱子(three)上就OK了,move(one,three)就这个意思!
else
{
hanoi(n-1,one,three,two);//当有n个盘子,按照递归法,调用hannoi,先把//上面的n-1个盘子从第一根柱子(one)借助第三根柱子(three)移到第二根柱//子上(two)。
move(one,three);//上面已把n-1个盘子移到第二根柱子上了,再将第一根柱//子剩下的一个盘子也就是最大的盘子从one移到three,明白?
hanoi(n-1,two,one,three);
/*移动好了最大的一个盘子,剩下n-1个盘子在two上,这时我们可以把第二根柱子与第一个柱//子的位置交换下,也就是标号为two的排第一,one排第二,three排第三。
这里的hanoi(n-1,two,one,three)对应
void
hanoi(int
n,char
one,char
two,char
three),只是盘子变成n-1
个,标号为two的柱子排第一了,下面要做的就是把two上上面的n-2个盘子借助three移到one上,再把剩下的一个移到第三个,再调换one
和two位置。
如此重复!注意转换位置只是我们头脑中的想象,程序本身没有转换柱子位置,编程完全按照标号(one
two
three)来实现的,我这样写只是便于理解递归过程,不知道是否理解?*/
}
}
void
move(char
x,char
y)
{
printf("%c-->%c\n",x,y);
}
/*move
函数只是起到一个打印步骤的作用,one对应‘A’,。。,比如move(one,two),就会打印出A-->B
*/
上面有些是我自己理解时的一些想法,希望能帮到你,实际你把代码对照算法多看几次就OK了,很容易的,理解了自己都可以写出来
⑻ 汉诺塔c语言的问题
设f(n, a, b,c) 表示 把n个盘从a移到c 借助b ,它等于三个步骤
1.n-1个盘从a移到b
2 1个盘从a移到c
3 n-1个盘从b移到c
看第一个步骤,n-1个盘从a移到b,设为g(n-1,a,c,b),它又等于三个步骤
n-2个盘从a移到c
1个盘从a移到b
n-1个盘从c移到b
这三个步骤恰恰是盘子为n-1时,从a移到b借助c的步骤,就是说,这三个步骤等于f(n-1,a,c,b)
所以g(n-1,a,c,b)=f(n-1,a,c,b),进而推的
f(n, a, b,c) = ( f(n-1, a,c,b) , f(1, a, b,c), f(n-1, b,a,c))
自己参悟吧,很简单的。
⑼ C语言汉诺塔程序
将以下内容全部复制到新建的源文件中:(本人自己写的,因为你那课本上的代码,没解释,书写不规范,很难理解清楚,所以我直接新写了一个完整的代码,附带详细说明)
#include <stdio.h>
//汉诺塔x层塔从A塔整体搬到C塔,中间临时B塔。
//x层塔是从大到小往上叠放。每次移动只能移动一层塔。并且在移动过程中必须保证小层在上边
//借助B塔可以将x层塔全部从A搬到C上,并且符合要求(在移动过程中大的那块在下边,小的那块在上边)
int main()
{
void tower(int x,char a,char b,char c); //声明函数
int x=5,a='A',b='B',c='C'; //x表示有5层塔,具体要多少层自己修改这个值。abc分别表示ABC塔。
tower(x,a,b,c); //x层塔从a移动到c的全过程,主程序只有这条有效语句
return 0;
}
//以下是tower函数的定义
//参数解析:x层塔放在a上,b是中间塔,c是目标塔。即x层塔要从a搬到c上。
//此函数实现x层塔从a整体转移到c上。以及这个过程是怎么搬的全部过程。
void tower(int x,char a,char b,char c)
{
if(x==1)printf("将%d从%c放到%c\n",x,a,c); //只有1层塔时,直接从a搬到c上。
else //不止1层塔,则先将x-1层塔从a按照规律搬到b上,再将最后一块从a搬到c上,最后再将b上的x-1层塔按照规律搬到c上。
{
tower(x-1,a,c,b); //先将x-1层塔从a按照规律搬到b上,注意参数b放在最后,因为放在最后的参数是准备搬过去的目标塔。
printf("将%d从%c放到%c\n",x,a,c); //将最后一块从a搬到c上
tower(x-1,b,a,c); //最后再将b上的x-1层塔按照规律搬到c上,注意参数b放在开头,因为x-1层是要从b上搬过去的。
}
}