6-1 汉诺塔

news2024/9/28 21:59:22

汉诺(Hanoi)塔问题是一个经典的递归问题。

设有A、B、C三个塔座;开始时,在塔座A上有若干个圆盘,这些圆盘自下而上,由大到小地叠在一起。要求将塔座A上的圆盘移到塔座B上,并仍按同样顺序叠放。在移动过程中要求遵守如下规则:

  • 每次只能移动一个圆盘;
  • 任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
  • 在满足前两条规则的前提下,可将圆盘移至A、B、C中任何一塔座上。                                

 

  •  例如,3个圆盘的初始状态如下

则移动过程如下:
A->B
A->C
B->C
A->B
C->A
C->B
A->B

要求实现一个递归函数,模拟输出n(1<=n<=8)个圆盘从塔座A借助塔座C移动到塔座B上的过程(用A->B表示将圆盘从A移到B,其他类似)。

函数接口定义:

 
void hanoi(int n, char from, char to, char by);

其中参数 n是圆盘数 、from是原来叠放圆盘的塔座 、to是最终叠放圆盘的塔座 、by是可借助的塔座。

裁判测试程序样例:

 
#include<iostream>
using namespace std;

//将n个圆盘借助by从from移到to
void hanoi(int n, char from, char to, char by);

//输入n,输出将原来在A上的n个圆盘借助C移动到B上的移动过程,控制到文件尾
int main() {
    int n, cnt=0;
    while(cin>>n) {
        cnt++;
        if (cnt>1) cout<<endl;
        hanoi(n, 'A', 'B', 'C');
    }
    return 0;
}

输入样例:

3
4

输出样例:

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

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

## 答案:

void hanoi(int n, char from, char to, char by)
{
    if(n == 1)
    {
         cout << from << "->" << to << endl;
        return;
    }
    else
    {
        hanoi(n-1,from,by,to);
        cout << from << "->" << to << endl;
        hanoi(n-1,by,to,from);
    }
}

## 思路:

汉诺塔问题是一个经典的递归问题,它描述了一种将一堆圆盘从一个塔座移动到另一个塔座的问题,同时需要遵守一些规则。问题的规则如下:

  1. 有三个塔座,通常称为A、B、C。
  2. 初始时,在塔座A上有若干个圆盘,这些圆盘自下而上,由大到小地叠在一起。
  3. 目标是将塔座A上的所有圆盘移动到塔座B上,并仍然按照相同的顺序叠放。
  4. 每次只能移动一个圆盘。
  5. 任何时刻都不允许将较大的圆盘放在较小的圆盘之上。
  6. 在满足前两条规则的前提下,可以将圆盘从A、B、C中的任何一个塔座移动到另一个塔座。

汉诺塔问题的目标是找到一种移动方案,将所有圆盘从起始塔座A移动到目标塔座B,中间可以借助辅助塔座C。这个问题可以通过递归算法来解决。

下面是一个详细解释递归函数 hanoi 的实现和工作原理:

void hanoi(int n, char from, char to, char by) {
    if (n == 1) {
        cout << from << "->" << to << endl;
        return;
    }
    
    // 递归步骤:
    // 1. 将前 n-1 个圆盘从起始塔座(from)经过目标塔座(by)移动到辅助塔座(by)上
    hanoi(n - 1, from, by, to);
    
    // 2. 将最大的圆盘从起始塔座(from)移动到目标塔座(to)上,并输出移动过程
    cout << from << "->" << to << endl;
    
    // 3. 将前 n-1 个圆盘从辅助塔座(by)经过起始塔座(from)移动到目标塔座(to)上
    hanoi(n - 1, by, to, from);
}

工作原理解释:

  1. 如果 n 等于 1,表示只有一个圆盘需要移动,直接将它从 from 移动到 to,并输出移动过程。

  2. 如果 n 大于 1,表示有多个圆盘需要移动。递归的过程如下:

    • 第一步:将前 n-1 个圆盘从起始塔座 from 经过目标塔座 to 移动到辅助塔座 by 上。这一步使用了递归调用,因为它也是一个汉诺塔问题,只不过规模减小了。

    • 第二步:将最大的圆盘从起始塔座 from 移动到目标塔座 to 上,并输出移动过程。这是实际的移动步骤。

    • 第三步:将前 n-1 个圆盘从辅助塔座 by 经过起始塔座 from 移动到目标塔座 to 上。这一步同样使用了递归调用。

这个递归过程会一直持续到只剩下一个圆盘需要移动,然后问题就会逐级返回,完成了所有圆盘的移动。

通过这种递归方法,你可以模拟汉诺塔问题的解决过程,并输出移动步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务是个坏主意吗?

曾几何时&#xff0c;我记得我的手指疯狂地敲打键盘&#xff0c;与庞大而杂乱的代码库搏斗。那是巨石的时代&#xff0c;代码就像古老的城堡一样&#xff0c;由一块块石头砌成一个令人印象深刻的庞然大物。 几年过去了&#xff0c;时代变了。开发人员口中的流行语变成了“微服…

TS同时打包和监视所有ts文件或只指定ts文件

当我们项目中ts文件较多时&#xff0c;我们如何直接打包所有ts文件为js文件&#xff1f;而不是使用tsc 文件名 一个一个去打包文件 一、配置tsconfig.json文件 创建一个tsconfig.json文件&#xff0c;该文件中不需要配置任何信息 二、控制台输入打包命令 在控制台输入如下代…

手机机型响应式设置2

window.screen.height&#xff1a;屏幕高度 window.innerHeight&#xff1a;视口高度&#xff08;去除浏览器头尾的高度&#xff09; document.body.clientHeight&#xff1a;内容高度 vh&#xff1a;网页视口高度的1/100 vw&#xff1a;网页视口宽度的1/100 vmax&#xff…

2万多条汉字笔画笔顺查询ACCESS\EXCEL数据库

发现很多新华字典类的数据都没有笔顺的相关数据&#xff0c;因此就找了一下笔顺查询相关&#xff0c;发现有两个模式&#xff0c;一种是每个字每个笔画都有一张图片&#xff08;很庞大的图片数据量&#xff09;&#xff1b;一种是笔画图片文件显示型&#xff0c;比如今天采集的…

Vue的详细教程--基础语法【下】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.事件处理器 ①.stop ②.prevent ③.on…

消费盲返模式:一种让消费者和商家都受益的新型消费返利模式

消费盲返是一种新型的消费返利模式&#xff0c;它的核心思想是&#xff1a;消费者在平台购买商品后&#xff0c;可以获得后续一定数量的订单的部分利润作为奖励。这样&#xff0c;消费者不仅可以享受商品的优惠&#xff0c;还有可能赚取更多的钱。 这种模式对于平台和消费者都有…

WorkPlus | 好用、专业、安全的局域网即时通讯及协同办公平台

自国家于2022年发布的《关于加强数字政府建设的指导意见》以来&#xff0c;我国数字政府建设已经迈入了一个全新的里程碑&#xff0c;迎来了全面改革和深化升级的全新阶段。 WorkPlus作为自主可控、可信安全、专属定制的数字化平台&#xff0c;扮演着政务机关、政府单位以及各…

mysql 导入sql文件

mysql 导入sql文件 sudo mysql -uroot -p123456 -h127.0.0.1 sudo mysql -uroot -p123456 -h127.0.0.1然后 show databases;然后 use 数据库名称; 然后 source 20230920031001.sql;如果不加 -h127.0.0.1 可能会出现错误 /var/lib/mysql.sock error 通过 navicat导入的话&am…

英语——分享篇——每日100词——201-300

chess——che车(拼音)ss两个美女(编码)——车里有两个美女在下国际象棋 April——ap阿婆(拼音)ri日(拼音)l棍子(编码)——四月份阿婆每日拿着棍子 palace——place地方——这个地方是宫殿 bottle——bo60(象形)ttle太太乐(拼音)——有60颗太太乐鸡精在瓶子里

VVICAPI接口解析,实现根据ID取商品详情

VVICAPI是一个虚构的API接口名称&#xff0c;我无法提供具体的VVICAPI接口解析。但是&#xff0c;我可以向您展示一般的API接口使用方法&#xff0c;以及如何根据ID获取商品详情的示例代码。 假设您有一个名为"VVICAPI"的接口&#xff0c;并且您已经获得了访问该接口…

epoll的并发服务器(TCP服务器与客户端通信)

服务器&#xff1a; #include<myhead.h> #define IP "192.168.250.100" #define PORT 8888 /* typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; …

使用vmware安装虚拟机时“出现此主机支持Intel VT-x,但Intel VT-x处于禁用状态”。

1、出现问题 使用vmware安装虚拟机时“出现此主机支持Intel VT-x&#xff0c;但Intel VT-x处于禁用状态”。 已将该虚拟机配置为使用 64 位客户机操作系统。但是&#xff0c;无法执行 64 位操作。 此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态。 如果已在 BI…

JPA的注解@Field指定为Keyword失败,导致查询不到数据

一、背景 使用 jpa 对es操作&#xff0c;查询条件不生效&#xff0c;需求是批量查询课程编号。说白了&#xff0c;就是一个In集合的查询。在es里&#xff0c;如果是精准匹配是termQuery&#xff0c;比如&#xff1a; queryBuilder.filter(QueryBuilders.termQuery(“schoolId…

【Vue】路由与Node.js下载安装及环境配置教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

Python之列表

标题 列表什么是列表列表的创建列表的删除列表的访问 列表的常用方法append()、insert()、extend()pop()、remove()、clear()count()、index() 列表支持的运算加法运算符乘法运算符*成员测试运算符in 内置函数对列表的操作列表推导式 切片操作&#xff08;1&#xff09;使用切片…

手机直播录屏软件哪家好?看这篇就够了!

随着智能手机的普及&#xff0c;移动互联网的飞速发展&#xff0c;手机直播和录屏已成为人们在日常生活中不可或缺的一部分。手机直播和录屏软件的广泛应用&#xff0c;满足了人们日常工作、学习、娱乐等各方面的需求。本文将介绍两款手机直播录屏软件&#xff0c;并通过分步骤…

最小二乘法预测波士顿房价

首先导入所需要的库 import sklearn import matplotlib.pyplot as plt from matplotlib import font_manager from matplotlib import rcParams from sklearn.datasets import load_boston from sklearn import linear_model from sklearn.model_selection import train_test_…

el-input-number 添加单位

效果&#xff1a; 数字长的时候也不会遮挡后面单位 1、使用css&#xff0c;代码 <el-form-itemlabel"功率 "><el-row><el-col :span"4"><el-switchv-model"formData.powerEnable":active-value"1":inactive-v…

反转单链表

思路图1&#xff1a; 代码&#xff1a; struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…

【解刊】IEEE旗下Trans系列,中科院1区TOP,国人占比79.388%排名第一!(附IEEE名单)

计算机领域 • 好刊解读 IEEE Transactions on Cybernetics 出版社&#xff1a;IEEE ISSN&#xff1a;2168-2267 eISSN&#xff1a;2168-2275 检索数据库&#xff1a;SCIE&EI 双检 数据库检索年份&#xff1a;2013年 出刊频率&#xff1a;月刊&#xff0c;一年一卷&…