C语言实现汉诺塔(图文详解)

目录
  • 思路:
    • 当n=1时:
    • 当n=2时:
    • 当n=3时:
    • 当n=4时:
  • 见代码
  • 运行截图
  • 总结

汉诺塔的游戏规则:

有三根金刚石柱子A、B、C,在A柱子上从下往上按照大小依次减小的顺序摞着64片黄金环。大梵天命令婆罗门把环从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在任何一个柱子上,小环上不能放大环,在三根柱子之间一次只能移动一个环。

即将A柱子上全部的环通过中间柱子B(B柱子作为中介)移动到C柱子上

当A只有一个环的时候:

A->C

当A只有两个环的时候:

A->B A->C B->C

当A只有三个环的时候:

A->C A->B C->B A->C B->A B->C A->C

思路:

1、将 n-1个环先放到B柱子上
2、将A柱子上的最后一个环移动到C柱子上
3、将n-1个环从B柱子移动到C柱子上

当n=1时:

1、将0个环先放到B柱子上

2、将A柱子上的最后一个环移动到C柱子上:A->C

3、将0个环从B柱子移动到C柱子上

当n=2时:

1、将1个环先放到B柱子上:A->B

2、将A柱子上的最后一个环移动到C柱子上:A->C

3、将1个环从B柱子移动到C柱子上:B->C

当n=3时:

1、将2个环先放到B柱子上:使用递归将2个环放到B上,因为A柱子的最后一个环是最大的因此可以先不理会,递归重复当n=2时的步骤,不过是从将2个环从A放到C上改为将2个环从A放到B上了

2、将A柱子上的最后一个环移动到C柱子上:A->C

3、将2个环从B柱子移动到C柱子上:使用递归将2个环从B柱子移动到C柱子上,此时C柱子上已经有了最大的一个环因此可以不用再理会了,递归重复当n=2的步骤,不过是从将2个环从A放到C上改为将2个环从B放到C上了

当n=4时:

1、将3个环先放到B柱子上:递归重复n=3的步骤,不过是从将3个环从A放到C上改为将3个环从A放到B上了

2、将A柱子上的最后一个环移动到C柱子上:A->C

3、将3个环从B柱子移动到C柱子上:递归重复当n=3的步骤,不过是从将3个环从A放到C上改为将3个环从B放到C上了

见代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void move(char X, char Y)
{
	printf("%c->%c ", X, Y);
}

void HanoiTower(int n, char A, char B, char C)
{
	if (n == 1)//递归终止条件
	{
		move(A, C);
		return;
	}

	else
	{
		HanoiTower(n - 1, A, C, B);//将n-1个环从A柱子放到B柱子上,C柱子作为中介
		move(A, C);//将A柱子上的最后一个环移动到C柱子上
		HanoiTower(n - 1, B, A, C);//将n-1个环从B柱子放到C柱子上,A柱子作为中介
	}
}

int main()
{
	printf("请确认A柱子上一共有多少个环:\n");
	int n = 0;
	scanf("%d", &n);
	HanoiTower(n, 'A','B','C');//将n个环从A柱子放到C柱子上,B柱子作为中介
}

运行截图

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言中的递归,你真的懂了吗?

    什么是递归? 要说到递归如果不说栈的话,我觉得有点不合适,递归特点就是不断的调用同一个函数,如果这个函数没有一个递归界限,那么就是死循环了,所以讨论递归,就必须要讨论递归的界限,就是限定这个递归调用多少次. 我们看一个例子 #include "stdio.h" int digui(unsigned long count ) { if(count > 0){ count --; printf("%d \n",count); digui(count); } ret

  • C语言递归之汉诺塔和青蛙跳台阶问题

    递归就是一个函数执行过程中调用自己,在c语言中有很多关于递归的经典问题,例如:斐波那契数列问题.汉诺塔问题等,在研究递归问题时我们要注意三点: 1.递归的结束条件 2.递归在每次进行过程中,都得离条件越来越近 3.相邻两次递归调用之间的关联关系 汉诺塔问题: 有三根杆子A, B, C.A杆上有N个(N > 1)穿孔圆盘, 盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 1.每次只能移动一个圆盘: 2.大盘不能叠在小盘上面,可将圆盘临时置于B杆, 也可将从A杆移出的圆盘重新移回A杆,

  • C语言程序中递归算法的使用实例教程

    1.问题:计算n! 数学上的计算公式为: n!=n×(n-1)×(n-2)--2×1 使用递归的方式,可以定义为: 以递归的方式计算4! F(4)=4×F(3) 递归阶段 F(3)=3×F(2) F(2)=2×F(1) F(1)=1 终止条件 F(2)=(2)×(1) 回归阶段 F(3)=(3)×(2) F(4)=(4)×(6) 24 递归完成 以递归方式实现阶乘函数的实现: int fact(int n) { if(n < 0) return 0; else if (n == 0 || n =

  • C语言编程递归算法实现汉诺塔

    汉诺塔 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 这个传说挺有意思的,这个传说

  • C语言汉诺塔的简单了解

    汉诺塔详解 以4层为例 以下为我的拙见,还希望大佬雅正 要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b 但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b 那就需要把1 2移动到c 由此我们可以推出要把1,2移动到c,只需要把1移动到b 这里我们发现有很多重复的自相似动作 我们就可以设计递归 递归需要1,递归体 2 出口. 递归体 移动n-1个盘子和1个盘子和n个盘子过程都是相似的 但是每次放入的杆子不一样. 出口 n=1时只剩一个盘子,直接移动到c即可

  • C语言实现汉诺塔(图文详解)

    目录 思路: 当n=1时: 当n=2时: 当n=3时: 当n=4时: 见代码 运行截图 总结 汉诺塔的游戏规则: 有三根金刚石柱子A.B.C,在A柱子上从下往上按照大小依次减小的顺序摞着64片黄金环.大梵天命令婆罗门把环从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在任何一个柱子上,小环上不能放大环,在三根柱子之间一次只能移动一个环. 即将A柱子上全部的环通过中间柱子B(B柱子作为中介)移动到C柱子上 当A只有一个环的时候: A->C 当A只有两个环的时候: A->B A->C

  • Java用递归方法解决汉诺塔问题详解

    目录 前言 一.问题描述 二.问题分析 三.解决方案 四.示例 前言 博主之前有写过关于递归问题的思维模式: 递归的思路 下面将用这种思维模式来求解经典汉诺塔问题. 一.问题描述 汉诺塔(又称河内塔)问题是源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上. 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 问应该如何操作? 玩法如下: 1.有三

  • GO语言开发环境搭建过程图文详解

    一.GO语言开发包 1.什么是GO语言开发包 go 语言开发包其实是对go语言的一种实现,包括相应版本的语法, 编译, 运行, 垃圾回收等, 里面包含着开发 go 语言所需的标准库, 运行时以及其他的一些必要资源 2.GO语言开发包下载地址 Go官方下载地址 : https://golang.org/dl/ Go官方镜像站(上面打不开可使用这个) : https://golang.google.cn/dl/ Go语言中文网下载地址 : https://studygolang.com/dl gop

  • C语言实现汉诺塔游戏

    操作就是:A B 号码A的塔顶一层放在号码B的塔顶.如1(空格) 3 回车. 话说有人能把我这C的代码添加到QT界面框架上去么?  代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高.... 里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以玩了. stackfunc.c #include"STACK.h" #include<stdio.h> extern ceng CENG[SIZE]; //数据入栈 void pus

  • C语言编写汉诺塔游戏

    目录 汉诺塔的游戏规则: 当A只有一个环的时候: 当A只有两个环的时候: 当A只有三个环的时候: 思路: 当n=1时: 当n=2时: 当n=3时: 当n=4时: 见代码 运行截图总结 汉诺塔的游戏规则:   有三根金刚石柱子A.B.C,在A柱子上从下往上按照大小依次减小的顺序摞着64片黄金环.大梵天命令婆罗门把环从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在任何一个柱子上,小环上不能放大环,在三根柱子之间一次只能移动一个环. 即将A柱子上全部的环通过C柱子(C柱子作为中介)移动到B柱子

  • Go语言实现汉诺塔算法

    hano.go package main import ( "bufio" "fmt" "os" "strconv" ) func main() { fmt.Print("输入要移动的盘子数:") reader := bufio.NewReader(os.Stdin) lool: data, _, _ := reader.ReadLine() n, err := strconv.Atoi(string(da

  • C语言中动态内存管理图文详解

    目录 1.动态内存开辟的原因 2.动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 3.常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free 3.4使用释放一块动态开辟内存的一部分 3.5对同一块动态内存多次释放 3.6动态开辟内存忘记释放(内存泄漏) 4.练习 4.1练习1 4.1练习2 4.3练习3 4.4练习4 5.C/C++程序的内存开辟 总结 1.动态内存开辟的原因 常见的内存

  • C++语言const 关键字使用方法图文详解

    之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点.知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自己的印象的同时,也方便以后查阅和学习.菜鸟一个,若有错误,望指正! const关键字 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.不管出现在任何上下文都是为这个目的而服务的. const使用方法 定义const对象 const修饰符可以把对象转变成常数对象,意

  • C语言运用函数的递归实现汉诺塔

    目录 1.汉诺塔是如何实现的 2.汉诺塔问题画图详解 3.汉诺塔问题代码解释 总结 1.汉诺塔是如何实现的 下面是有三个盘子的示例: 从左到右一次是 A柱 B柱 C柱 A柱:起始位置 B柱:目标位置 C柱:过度位置 汉诺塔为题即是,将A柱上的所有盘子移动到B柱上,且每次只能移动一个盘子,并且小盘子必须在大盘子上面 2.汉诺塔问题画图详解 下面的例子是以A柱为起始位置,B柱为中间位置,C柱为目标位置的 如果初始状态下:A柱只有一个盘子:A->C A柱有两个盘子:A->B A->C B-&g

随机推荐