1205:汉诺塔问题
【题目描述】
约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:18,446,744,073,709,551,615
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。
假定圆盘从小到大编号为1, 2, ...
【输入】
输入为一个整数(小于20)后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
【输出】
输出每一步移动盘子的记录。一次移动一行。
每次移动的记录为例如 a->3->b 的形式,即把编号为3的盘子从a杆移至b杆。
【输入样例】
2 a b c
【输出样例】
a->1->c a->2->b c->1->b
汉诺塔问题其实说简单也不简单,到是难起来还是很难的,因为我们的脑袋的堆栈有限,我们只能枚举几个有限的例子,但是如果我们找到规律就可以用递归去做啊,这就是递归的好处,但是递归的坏处就是太费时间,
汉诺塔问题就是把n个盘子,先把n-1个盘子移动到过度盘,然后把第n个盘子移动到目标盘
这题注意一下,是把a盘移动到b 而不是我们的常规思维移动到c盘
#include<iostream>
#include<map>
#include<cstring>
#include<cstdio>
using namespace std;
int k=0;
void f(int n,char a,char c,char b)
{if(n==0) return ;f(n-1,a,b,c);printf("%c->%d->%c\n",a,n,b);f(n-1,c,a,b);}
int main()
{int n;cin>>n;char a,b,c;cin>>a>>b>>c;f(n,a,c,b);return 0;
}
1205:汉诺塔问题相关推荐
- 信息学奥赛一本通 1205:汉诺塔问题 | OpenJudge 2.2 6261:汉诺塔问题
[题目链接] [ybt 1205:汉诺塔问题 OpenJudge 2.2 6261:汉诺塔问题 [题目考点] 1. 递归 [解题思路] 设输入的左中右三个杆分别为a,b,c.题目要将摞在a杆上的n层汉 ...
- 信息学奥赛一本通(1205:汉诺塔问题)
1205:汉诺塔问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 19568 通过数: 7240 [题目描述] 约19世纪末,在欧州的商店中出售一种智力 ...
- 一本通1205:汉诺塔问题(含严格证明)
[题目描述] 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移 ...
- 汉诺塔(三)_栈的应用
问题 E: 汉诺塔(三) 时间限制: 3 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...
- 汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)
前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较繁琐的.所以又根据这个公式又写了一个. ...
- Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有
1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s== ...
- 技术图文:如何实现汉诺塔问题?
背景 最近在辅导小孩们学习编程,在介绍函数递归时,最典型的就是汉诺塔问题了. 我在这里总结一下,以方便大家的学习. 汉诺塔问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在 ...
- 汉诺塔问题---小昝
C语言 #include <stdio.h> void move(char A,char C){printf("%c ---> %c\n",A,C); }void ...
- 轻松理解汉诺塔问题(图解java描述)
引言:(易于理解) 汉诺塔看似简单的几行代码,却蕴含着奇妙的算法.我从我个人学习的角度来说.我一开始理解了原理,但是编码不会编,这也就是所谓的眼高手低.多研究多在IDE(eclipse-java,VS ...
- 栈与队列5——汉诺塔问题(方案二)
题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法二:非递归法 ...
最新文章
- Linux目录与文件常见处理命令
- [文件系统]文件系统学习笔记(一)---基本概念以及inode
- 访问List的itemRenderer的组件中定义的方法
- 算法提高 高精度乘法(java)
- 计算机组成原理实验内存读数,计算机组成原理实验
- ubuntu ssh 登录日志_全球第一开源ERP Odoo操作手册 安装ssh服务和ssh客户端
- javascript高级程序设计笔记-第八章(BOM)
- 【优化布局】基于matlab遗传算法求解带出入点的车间布局优化问题【含Matlab源码 011期】
- linux精简版远程登录,Linux下定制SSH来简化远程访问的方法
- 非参数统计单样本非参数检验之符号检验
- python怎么读单词和古文_Python 实现文言文词频统计
- cisp_pte培训试题
- Android Q 修改Fingerprint
- STM32 定时器编码器模式时,如何理解编码器计数
- Debian 11(bullseye) 安装Nextcloud,使用PostgreSQL
- 《必然》 一书中120条书摘
- Java8新特性JDK8之joining函数
- 基于安卓的校园订餐系统开发设计
- 安卓卡片式ViewPager
- 期末安卓——摆烂小白一天的复习生活