当前位置:首页 » 编程语言 » 梵塔问题c语言

梵塔问题c语言

发布时间: 2022-04-27 11:08:48

c语言汉诺塔问题,不是很理解

请注意,void hanoi ( int n, char a, char b, char c )
这里的a,b,c是三个char变量。
当执行调用hanoi(3,'B','C','A');时,“将a柱子上的最后一个盘子移动到c”,
其中的a的值就是'B',c的值就是'A',也就是“将B柱子上的最后一个盘子移动到A柱”了。

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

算法思想
对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n>1),则分成几步走:把 (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语言——汉诺塔问题

#include<stdio.h>
staticinta[3][10],n;
voidshow()
{
inti,j;
for(i=0;i<3;i++)
{
for(j=0;j<n;j++)
if(a[i][j]==-1)printf("*");
elseprintf("%d",a[i][j]);
printf("");
}
printf(" ");
}
voidmove(intx,inty)
{
inti=0,j=n-1;
while(a[x][i]==-1)i++;
while(a[y][j]!=-1)j--;
a[y][j]=a[x][i];
a[x][i]=-1;
show();
}


intf(intx,intp,intq)
{

intz=3-p-q;
if(x==1)move(p,q);
else
{
f(x-1,p,z);
move(p,q);
f(x-1,z,q);
}
}
intmain()
{
inti,j;
printf("输入盘子数量(1到9):");
scanf("%d",&n);
for(i=0;i<3;i++)
for(j=0;j<n;j++)
a[i][j]=-1;

for(j=0;j<n;j++)
a[0][j]=j;

f(n,0,2);


}

❹ 设计一个梵塔(又称汉诺塔)问题的求解程序

#include "stdio.h"
void move(int n, int x, int y, int z)
{
if (n == 1) printf("%c-->%c\n", x, z);
else
{
move(n - 1, x, z, y);
printf("%c-->%c\n", x, z);
move(n - 1, y, x, z);
}
}
int main()
{
move(7, 'a', 'b', 'c');
getchar();
}

❺ C语言汉诺塔问题

关于汉诺塔这个东西是相当的抽象,我当时学习的时候看了好几个版本的教程,也没有搞懂,最后还是自己反复的理解,顿悟了,

所以我这里把当时我作为初学者的想法写给你,但是最重要的还得靠你自己的理解:

1、对于void hanoi(int n,char one ,char two,char three);这个函数,表示

将n个盘子从one通过two移动到three

我当时是这么想的:先不管hanoi函数内部发什么啥,只要这么的执行一次,肯定的,就有n个盘子已经成功移动到three啦

2、理解了上面的含义后,我是这么想的:

要将5个盘子从A移动到C(通过B),就得先从A将4个移动到B(通过C),一个从A到C,再从B移动4个到C(通过A),搞定

所以说hanoi(5,'A' , 'B', 'C'); 里面其实分为三步:

1)hanoi(4, 'A' , 'C', 'B');

2) printf("A->C");

3)hanoi(4, 'B' , 'A', 'C');

就是这样的三步,至于1)这部嘛,反正我坚信:只要执行了这句函数,不管过程,最终A会移动到C4个的

3、然后是最后一点,对于hanoi这个函数,是指将将n个盘子从one通过two移动到three,所以函数内部这么写:

{
hanoi(n-1,one,three,two);
printf("%c->%c",one,three);
hanoi(n-1,three,two);
}

代码和你给的略有不同,你的代码将printf专门又用了一个函数来实现,原理是一样的

可能是由于你真好学习到函数的相关,所以这个教程故意想弄得复杂点。。。

但是,

这里还应该有一个判断语句,if(n==1),也就是只有1块需要移动,也就不需要这么麻烦的三步了,直接移动就好了,所以最终的代码:

{
if(n==1)
printf("%c->%c",one,three);
else
{
hanoi(n-1,one,three,two);
printf("%c->%c",one,three);
hanoi(n-1,three,two);
}
}

=============================================

以上就是我的回答,希望对你有帮助

汉诺塔这东西主要需要的还是自己的反复理解,想通了就简单啦~

如果还有什么疑问欢迎随时向我追问

^o^

❻ C语言 递归 梵塔问题

这是汉罗塔问题,其中的'N'表示的是盘子的个数.move(n,a,b,c)中的n即表示现在需要搬动的盘子数,'a'位置的参数(即move()函数中的第二个参数表示要移出盘子的"柱子"的编号),同理'c'位置的参数(即move()函数中的第四个参数表示要移入盘子的"柱子"的编号).
如:mov(n,b,a,c)就是要将'b'柱子中的第一个盘子移动到'c'柱子上去.

❼ 汉诺塔问题的C语言程序应该怎么写并请说明一下原因

其实主要就是三个步骤:
第一,把a上的n-1个盘通过c移动到b。
第二,把a上的最下面的盘移到c。
第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。#include<stdio.h>

voidmove(intn,chara,charb,charc)
{
if(n==1)
printf(" %c->%c ",a,c);//当n只有1个的时候直接从a移动到c
else
{
move(n-1,a,c,b);//第n-1个要从a通过c移动到b
printf(" %c->%c ",a,c);
move(n-1,b,a,c);//n-1个移动过来之后b变开始盘,b通过a移动到c
}
}

intmain()
{
intn;
printf("请输入要移动的块数:");
scanf("%d",&n);
move(n,'a','b','c');
return0;
}

❽ c语言问题的汉诺塔问题

A-B B-C就等于A-C只是多移动一次而已。所以你的想法实质是A-C A-C A-C A-B C-B这就明显的错误了阿!C上面已经有盘子了你不能在进行A-c这步了阿!因为盘子是大的在下,小的在上。

❾ 用C语言完整地编三阶梵塔问题

#include<stdio.h>
void hanoi(int,char,char,char);
void move(char,char);

void hanoi(int n,char a,char b,char c){
if(n==1){
move(a,c);
}

else if(n>1){
hanoi(n-1,a,c,b);
move(a,c);
hanoi(n-1,b,a,c);
}
}

void move(char a,char b){
printf("%c------>%c\n",a,b);
}

void main(){
int n;
printf("输入汉诺塔阶数:");
scanf("%d",&n);
printf("移动方法如下:\n");
hanoi(n,'A','B','C');
}

热点内容
美嘉算法口诀 发布:2025-05-16 06:03:15 浏览:952
c程序编译连接 发布:2025-05-16 06:02:36 浏览:964
脚本魔兽 发布:2025-05-16 06:01:52 浏览:330
文件夹python 发布:2025-05-16 06:01:43 浏览:627
电脑我的世界服务器游戏币 发布:2025-05-16 05:27:25 浏览:488
索尼手机为什么不能用安卓10 发布:2025-05-16 05:18:46 浏览:784
蔚来es6选择哪些配置实用 发布:2025-05-16 05:18:05 浏览:130
小米如何扫码wifi密码 发布:2025-05-16 05:13:38 浏览:807
楼层密码是什么意思 发布:2025-05-16 05:13:37 浏览:13
创建文件夹失败 发布:2025-05-16 05:12:59 浏览:397