首页 > 其他分享 >汉诺塔问题详解

汉诺塔问题详解

时间:2024-10-31 16:47:21浏览次数:5  
标签:char 圆盘 起始 three 目标 问题 详解 汉诺塔 柱上

汉诺塔游戏规则

在一根柱子上从下往上按照大小顺序放置一定数量的圆盘,有三根柱子,把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

该问题可以理解为,先将有圆盘的柱子上的n-1个圆盘放到辅助柱上,再将最后一个圆盘放到目标柱上,最后将辅助柱上的n-1个圆盘放到目标柱上。

如图:

代码实现

#define _CRT_SECURE_NO_WARNINGS	
#include<stdio.h>

void move(char x, char y)//实现圆盘移动
{
	printf("从%c柱上拿一个盘子到%c柱上\n", x, y);
}

void hanoi(int n, char one, char two, char three)//one指起始点,three指目标点,two是上一个盘的目标点
{
	if (n == 1)
	{
		move(one, three);
	}
	else
	{
		hanoi(n - 1, one, three, two);//改变目标点
		move(one, three);
		hanoi(n - 1, two, one, three);//改变起始点
	}
}

int main()
{
	int n;//n为起始柱上圆盘的数量
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');//一开始设置A为起始柱,B为辅助柱,C为目标柱
	return 0;
}

可能看到这个代码,有很多人还是一脸懵逼,为什么要改变起始点和目标点,如果只是用一个n=**的代码怎么运行的例子解释,那么换另一个n后代码怎么实现我们就又不清楚了,所以我们需要找出其中的逻辑关系。

我用画图方法进行解释:

改变目标点的基本思想:

补充:1盘挪动后由于n=1,所以该次语句结束,跳回上一个函数进行下一个move语句,将2挪动到目标点。

改变起始点的基本思想:

在上图中1盘还在B柱上,需要将其挪动到C柱上,由于起始点(也就是one)一直等于A,使得处于B柱的1盘无法挪动,这时我们需要改变起始点(也就是没有改变起始点前的目标点和辅助点进行交换),实现1盘从B到C的挪动。

当盘子为n个时:

这其实就是无限套娃n个套n-1个,n-1套n-2个。。。。

做这个,需要对递归思想和函数有一定的了解

标签:char,圆盘,起始,three,目标,问题,详解,汉诺塔,柱上
From: https://blog.csdn.net/heiyu211/article/details/143260384

相关文章

  • 【Linux】巧妙运用<信号量>解决<水果放取问题>(思维导图&代码演示&思路解析)
    前言大家好吖,欢迎来到YY滴Linux系列,热烈欢迎!本章主要内容面向接触过C++的老铁主要内容含:欢迎订阅YY滴C++专栏!更多干货持续更新!以下是传送门!YY的《C++》专栏YY的《C++11》专栏YY的《Linux》专栏YY的《数据结构》专栏YY的《C语言基础》专栏YY的《初学者易错点》......
  • openwrt解决docker拉取失败问题
    非原创,原文链接:loveyu.org/6115.html背景:在openwrt上的docker拉取失败,提示如下错误:root@openwrt:\~#dockerpulldebianErrorresponsefromdaemon:Get"https://registry-1.docker.io/v2/":contextdeadlineexceeded(Client.Timeoutexceededwhileawaitingheade......
  • 项目经理如何处理项目中的道德和合规问题
    项目经理处理项目中的道德和合规问题首先需要明确项目合规标准、设立道德规范、开展全面风险评估、及时沟通并采取行动。项目经理的角色不仅要确保项目顺利实施,还需维护企业和项目组的道德标准、遵守相关法律法规。一项重要的工作是设立明确的道德规范,确保团队成员知晓并遵循。这......
  • Python工具箱系列:Pandas 数据清洗与预处理详解
    目录一、数据清洗与预处理的重要性二、Pandas简介三、Pandas数据清洗与预处理技巧1.读取数据2.查看数据3.处理缺失值4.处理重复值5.处理异常值6.处理数据类型不一致7.处理数据格式不一致8.数据标准化和归一化9.数据编码四、案例:使用Pandas进行数据清......
  • Python数据类型之自定义类型——Class与面向对象编程详解
    目录引言一、面向对象编程基础二、类的定义与对象的创建三、封装性四、继承性五、多态性六、特殊方法与数据类七、使用dataclass装饰器八、面向对象编程的优势结论引言Python是一门功能强大的编程语言,其面向对象编程(OOP)的特性更是为开发者提供了极大的灵活性和......
  • Windows11系统iisetw.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个iisetw.dll文件(挑选合适的版本文件)把它放......
  • Zipkin使用指南分布式追踪核心概念与架构详解
    1.简介什么是ZipkinZipkin是一个分布式追踪系统,主要用于监控和分析微服务架构中的调用链路。它帮助开发者和运维团队深入理解服务调用路径,从而识别性能瓶颈、异常或故障点。Zipkin最初是由Twitter开源的,当前已成为微服务追踪的流行解决方案,特别是在SpringCloud、Kuberne......
  • 如何处理Tcp粘包半包问题
    专注于.NET技术开发的博主,关注我个人微信公众号查看更多:承哥技术交流小作坊。TCP是网络传输层中非常重要的传输协议,广泛应用于Http、WebSocket、FTP、Telnet、SMTP、POP3与DNS等应用协议。了解TCP的基本原理对我们分析网络问题有着举足轻重的作用。此次我们先来了解下:如何解决......
  • C# 如何给文件夹赋予权限,以解决权限不足问题
    专注于.NET技术开发的博主,关注我个人微信公众号查看更多:承哥技术交流小作坊。我们知道,windows操作系统系统盘的权限控制是比其它磁盘更严格的。我们应用程序如果想在C盘下进行文件读写,大部分需要管理员权限才行(像AppData,ProgramData这种目录除外)。补充说明:AppData:通常用于存......
  • 如何解决quartz.dll损坏的问题:方法分享
    quartz.dll是Windows系统中的一个重要文件,通常与DirectShow有关,用于处理多媒体内容。如果quartz.dll文件损坏,可能会导致视频播放问题、系统错误消息,甚至影响某些软件的正常运行。以下是一些解决quartz.dll损坏问题的方法:一、使用系统文件检查器(SFC)打开命令提示符:按下Win+X......