汉诺塔问题—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、C++系列-1】C语言实现:寻找[1,100]之间的素数

    C C 43 43 系列 1 C语言实现 xff1a 寻找 1 100 之间的素数 1 问题 C语言实现 xff1a 寻找 1 100 之间的素数 2 实现代码 span class token comment 寻找 1 100 之间的素数
  • Linux下生产者消费者问题的C语言实现

    注 xff1a 查看全文请关注作者 xff0c 或点击前往 xff1a 生产者 消费者问题的C语言实现 实验六 生产者 消费者问题实现 实验题目 要求 在Linux操作系统下用C实现经典同步问题 xff1a 生产者 消费者 xff0c 具体
  • C语言实现strcmp()函数

    span class token macro property span class token directive keyword define span CRT SECURE NO WARNINGS span span class to
  • n阶行列式计算Python和C语言实现

    行列式在数学中 xff0c 是一个函数 xff0c 其定义域为det的矩阵A xff0c 取值为一个标量 xff0c 写作det A 或 A 无论是在线性代数 多项式理论 xff0c 还是在微积分学中 xff08 比如说换元积分法中 xff
  • <操作系统>读者写者问题(读者优先)C语言实现

    问题描述 代码 span class token macro property span class token directive keyword include span span class token string lt stdio
  • 选择排序算法(C语言实现)

    include lt stdio h gt void choice int a int n int i j temp for i 61 0 i lt n 1 i 43 43 for j 61 i 43 1 j lt n j 43 43 if
  • 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成 xff0c 我去研究如何用C语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能 xff0c 用户通过网
  • 一篇文章带你搞懂扫雷小游戏(c语言实现)

    目录 前言 1 游戏设计逻辑 2 游戏思考及实现过程 2 1符号与棋盘的建立 2 2棋盘的初始化与打印 2 3布置雷 2 4 排查雷并设置结束标志 3 代码展示 test c game c game h 前言 扫雷是一款经典的小游戏 xff
  • C 语言实现 FTP 服务器

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

    如果想要自己写一个服务器和客户端 xff0c 我们需要掌握一定的网络编程技术 xff0c 个人认为 xff0c 网络编程中最关键的就是这个东西 socket 套接字 socket 套接字 xff1a 简单来讲 xff0c socket就是用
  • 汉诺塔问题(C语言实现)

    前言 一 汉诺塔圆盘的移动步数 二 汉诺塔圆盘移动步骤 总结 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子
  • PID连续控制算法的表达式以及C语言实现

    1 数字 xff08 离散 xff09 PID控制算法的表达式 xff1a 将PID调节器离散化 xff0c 用差分方程来代替连续系统的微分方程 xff0c 分为位置式和增量式两类 重点理解概念如下 xff1a a xff09 基本偏差e
  • 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语言实现

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

    https www cnblogs com diligenceday p 6255788 html
  • 比较冒泡排序、选择排序和快速排序的时间(C语言实现)

    文章目录 前言代码设计代码实现运行结果结果分析稳定性测试 总结 前言 本文主要比较冒泡排序 快速排序 选择排序的时间 冒泡排序和快速排序的思想可以参考我转载的以下博文 xff1a https blog csdn net gogo0707 a
  • C语言实现TCP通信

    C语言通过socket编程实现TCP通信 服务端客户端通信例子 xff1a socket tcp 通信1 xff0c socket tcp通信2 xff0c udp使用讲解 xff0c socket udp通信例子 TCP IP协议 叫做传
  • 汉诺塔问题—C语言实现

    一 题目描述 相传在古印度圣庙中 xff0c 有一种被称为汉诺塔 Hanoi 的游戏 该游戏是在一块铜板装置上 xff0c 有三根杆 编号A B C xff0c 在A杆自下而上 由大到小按顺序放置64个金盘 如下图 游戏的目标 把A杆上的金
  • 分治法求解汉诺塔问题

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

随机推荐