汉诺塔问题—C语言实现

2023-05-16

一、题目描述

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上上。(摘自360百科)

二、求解思路

1、看到这个问题,我们可以总结出三点有用的信息
       a.只能移动最顶端的盘子
       b.一次只能移动一个盘子
       c.移动过程一定保持大圆盘在下小圆盘在上

2、共有A、B、C三个杆子
如果只有一个盘子,直接将目标盘子从A<--->C
如果有两个盘子,将1从A<--->B,将2从A<--->C
如果是三个盘子呢??经过思考我们不难得出第1步将A<----->C,第2步将A<----->B,第3步将C<----->B,第4步将A<----->C,第5步将B<----->A,第6步将B<----->C,第7步将A<----->C

从这里我们好像看到了递归的影子,递归的思想就是“将大事化小”,我们移动三个盘子的时候,是以C为媒介将1,2两个盘子移到B上,再将3号盘子由A移向C。所以我们每次只要分离出最大的盘子,再将最大的盘子移动到目标杆。

假如有n个盘子,我们应该把n-1个盘子移走,那么如何做呢?我们应该把以C为过渡柱将n-1个盘子暂时放在B柱子上,再将第n个盘子从A<---->C,接下来又是同样的算法,暂存在B柱子上的n-1个盘子以C柱为媒介暂存n-2个盘子在A柱子上,再将B柱子上的最大的盘子移动到C柱子上。

递归的两个条件:

①限制条件:n=1时不再递归

②每次移动时当前最大的盘子已经移到目标杆子上去了,数量就减一,越来越接近这个限制条件

三、附上代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int i = 0;
void move(int n, char from, char to)
{
	i++;
	printf("第%d步将%d号盘子%c<----->%c\n",i, n, from, to);
}

Hanoi(int n, char A, char B, char C)
{
	if (n == 1)
	{
		move(n, A, C);
	}
	else
	{
		Hanoi(n - 1, A, C, B);
		move(n, A, C);
		Hanoi(n - 1, B, A, C);
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	Hanoi(n, 'A', 'B', 'C');
	printf("共%d步\n", i);
	return 0; 
}

 

 

递归还是很晦涩,我只是讨论了前几种情况,寻找其中的规律。继续学习理解再来补充。如果写的有错误或者有什么建议可以告诉我谢谢,及时修正。。

(* ̄︶ ̄)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汉诺塔问题—C语言实现 的相关文章

  • C语言实现strcmp()函数

    span class token macro property span class token directive keyword define span CRT SECURE NO WARNINGS span span class to
  • MergeSort(迭代归并排序)——C语言实现

    前言 xff1a 归并排序跟快速排序有异曲同工之妙 xff0c 都是分治法的典型代表 但是这种分治法都有不小的弊端 xff0c 就是需要占用大量的系统栈 xff0c 很容易造成空间的大量浪费 xff0c 所以就有用迭代来优化递归的操作 这次
  • 用c语言实现 将src指向的字符串追加到dest指向字符串的后面

    实现char my strcat char dest char src 函数 返回 xff1a dest字符串的地址 功能 xff1a 将src指向的字符串追加到dest指向字符串的后面 例如 xff1a char dest 10 61 3
  • 数组排序(C 语言实现)

    本文主要包含常见的数组排序方法 选择排序 原理 在原始数组中取未排序的首元素 xff0c 与其后方所有元素比较 xff0c 不满足顺序 xff0c 则交换首元素此时满足条件 xff0c 未排序部分后移重复上述操作 代码实现 include
  • Python汉诺塔问题

    汉诺塔描述 古代有一座汉诺塔 xff0c 塔内有3个座A B C xff0c A座上有n个盘子 xff0c 盘子大小不等 xff0c 大的在下 xff0c 小的在上 xff0c 如图所示 有一个和尚想把这n个盘子从A座移到C座 xff0c
  • 贝叶斯网络python实现_朴素贝叶斯和贝叶斯网络算法及其R语言实现

    原标题 xff1a 朴素贝叶斯和贝叶斯网络算法及其R语言实现 作者 xff1a 鲁伟 一个数据科学践行者的学习日记 数据挖掘与机器学习 xff0c R与Python xff0c 理论与实践并行 个人公众号 xff1a 数据科学家养成记 微信
  • 中序计算式的计算器模型C语言实现

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • C语言实现Split函数

    借助C语言的动态内存分配 xff0c 实现类似VB中Split函数的效果 结构体介绍 xff1a IString xff1a 参数 str 字符串数组的指针 参数 num 字符串个数 函数介绍 功能 xff1a 按一个字符来拆分字符串 参数
  • 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成 xff0c 我去研究如何用C语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能 xff0c 用户通过网
  • C 语言实现 FTP 服务器

    这个有专门的课程讲解我看到 xff0c 百度也能搜到不少相关的 我觉得你可以去把这个弄懂
  • 无名的ADRC的C语言实现

    分为ADRC h和ADRC c 确实看头文件有用 xff0c 有哪些变量都一目了然 和ACfly一样的是比如都有beta这个参数 ADRC c 本程序只供购买者学习使用 xff0c 版权著作权属于无名科创团队 xff0c 无名科创团队将飞控
  • 汉诺塔问题(C语言实现)

    前言 一 汉诺塔圆盘的移动步数 二 汉诺塔圆盘移动步骤 总结 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子
  • ubuntu下串口发送或者接收(c语言实现)minicom调试

    关于串口的知识这里就不累赘了 xff0c 看着多又烦 xff0c 搞这个的都懂串口 xff0c 不多废话了 xff01 xff01 进入正题 xff01 xff01 1 选择合适的usb串口模块 某宝很多这种模块 xff0c 有各种型号的
  • C语言实现http post请求和get请求,post请求可以上传图片和文件

    文章目录 1 http协议简介2 http协议分析2 1 http请求2 1 1 请求行2 1 1 1 请求方法2 1 1 2 URL2 1 1 3 协议版本2 1 1 4 请求行总结 2 1 2 请求头部2 1 3 请求数据 2 2 ht
  • C语言实现“井字棋”游戏(三子棋)人机对弈

    井字棋游戏 xff1a 即三子棋 xff0c 英文名叫Tic Tac Tic xff0c 是一种在3 3格子上进行的连珠游戏 xff0c 和五子棋比较类似 xff0c 由于棋盘一般不画边线框 xff0c 格线排成井字故得名 题目分析 xff
  • SHA1校验算法C语言实现

    SHA1 安全哈希算法 xff1a 对于长度小于2 64位的消息 1M 61 1024k 1K 61 1024字节 xff0c 1BYTE 61 8bit 可以想象一下2的63次方位可以表示一个多大的数据文件 xff0c SHA1会产生一个
  • c语言实现strcat函数

    char strcat char strDestination const char strSource 一 函数介绍 作用 xff1a 连接字符串的函数 xff0c 函数返回指针 xff0c 两个参数都是指针 xff0c 第一个参数所指向
  • 数据结构哈希查找的C语言实现

    大家好 xff0c 我是练习编程时长两年半的昆工第一ikun xff0c 今天我们来分享查找算法中的一个 哈希查找 xff0c 哈希查找适用于有庞大的数据量时的查找 xff0c 是一种很好用的查找算法 xff0c 话不多说 xff0c 开团
  • C语言实现TCP编程

    C语言实现TCP编程 1 主机字节序和网络字节序2 套接字的地址结构IP地址转化的方法 3 TCP的网络接口4 TCP服务器端的编程流程5 TCP客户端的编程流程6 运行结果 1 主机字节序和网络字节序 主机字节序 xff1a 不同的芯片
  • 分治法求解汉诺塔问题

    汉诺塔问题简介 汉诺塔 又称河内塔 问题是源于印度一个古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 并且规定

随机推荐