汉诺塔

Python之汉诺塔递归运算

匿名 (未验证) 提交于 2019-12-02 22:51:30
  汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?   使用python递归函数可以实现   move.py def move(n, a, b, c): if n == 1: print(a, '-->', c) else: move(n-1, a, c, b) #把n-1个盘子从 a 移动到 b move(1, a, b ,c)#把1个盘子从 a 移动到 c move(n-1, b, a, c)#把n-1个盘子从 b 移动到 c #一直循环到n==1 move(3, 'A', 'B', 'C')   实现过程,如果只有一个盘则只需要把盘从a移动到c即可,如果有多个呢   第三步:把已经移动到b的n-1个盘移动到c 完成整个移动过程   下面以n=2为例演示移动过程   n=3时流程图

Python实现汉诺塔

青春壹個敷衍的年華 提交于 2019-12-02 19:42:19
汉诺塔   汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 实现汉诺塔的基本思路: 汉诺塔主要是有三个塔座A,B,C,要求将三个大小不同,依小到大编号为1,2.....n的圆盘从A移动到塔座C上,要求   (1):每次只能移动一个圆盘   (2):圆盘可以插到A,B,C中任一塔座上   (3):任何时候不能将一个较大的圆盘压在较小的圆盘之上 算法分析: 将 N 个圆盘从左边柱子移动到右边柱子: [递归的]将 N-1 个圆盘从左边柱子移动到中间柱子。 将最大的圆盘从左边柱子移动到右边柱子。 [递归的]将 N-1 个圆盘从中间柱子移动到右边柱子  算法实现: def hanoi(n, a, b, c): if n == 1: print(a, '-->', c) else: hanoi(n - 1, a, c, b) print(a, '-->', c) hanoi(n - 1, b, a, c) # 调用 hanoi(5, 'A', 'B', 'C')   运行结果: 来源: https://www.cnblogs.com/chenchang

多柱汉诺塔问题“通解”——c++

丶灬走出姿态 提交于 2019-12-02 13:14:25
多柱汉诺塔问题 绪言 有位同学看到了我的初赛模拟卷上有一道关于汉诺塔的数学题。大概就是要求4柱20盘的最小移动次数。 他的数学很不错,找到了应该怎样推。 如果要把n个盘子移到另一个柱子上,步骤如下: 把一部分盘子(靠上的r个)移到一根空柱子上,移动过程中可用的柱子有4根 将剩下的n-r个盘子移到另一根空柱子上,移动过程中可用的柱子为3根(这n-r个盘子都不能放在放有前r个盘子的柱子上) 将第一步移动的r根柱子移到n-r个盘子上方,移动过程中可用的柱子有4根 其实,他说的就是多柱汉诺塔的 Frame-Stewart算法 的m=4时的情况 Frame-Stewart算法 设原来有n个盘子,m个柱子 把一部分盘子(靠上的r个)移到一根空柱子上,移动过程中可用的柱子有m根 将剩下的n-r个盘子移到另一根空柱子上,移动过程中可用的柱子为m-1根(这n-r个盘子都不能放在放有前r个盘子的柱子上) 将第一步移动的r根柱子移到n-r个盘子上方,移动过程中可用的柱子有m根 推导式 设F m (n)=有m个柱子,n个盘子所需要移动的最小步数。 则 F m (n)=min 0<r<n {2*F m (r)+F m-1 (n-r)} 那么这个r到底是多少呢? 那就要来枚举咯…… 代码 来源: https://www.cnblogs.com/send-off-a-friend/p/11706474.html

PTA 汉诺塔的非递归实现

旧巷老猫 提交于 2019-12-02 09:13:47
借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。 输入格式: 输入为一个正整数N,即起始柱上的盘数。 输出格式: 每个操作(移动)占一行,按 柱1 -> 柱2 的格式输出。 输入样例: 3 输出样例: a -> c a -> b c -> b a -> c b -> a b -> c a -> c 思路: 递归思路: (1)先将 n - 1 个盘子从 a 通过 c 移动到 b 。 (2)再将最后一个盘子从 a 移动到 c 。 (3)最后将 n - 1 个盘子从 b 通过 a 移动到 c 。 非递归思路: (1)将最小圆盘移动到下一个柱子上 (2)对剩余两柱子进行顶上最小的元素判断,把小一点的圆盘移动到大一点的圆盘上(有空柱则摞在空柱子上)。 重复上述两步就可以得到答案。 注意:这样得到的最后的答案不一定是摞在 c 上,如果 N 是奇数将摞在 b 上,所以如果 N 是奇数我们就令第二个柱子为 c ,第三个柱子为 b ,这样就一定最后是摞在 c 上的。 代码: 递归代码: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; void move

汉诺塔问题递归与非递归算法

ぃ、小莉子 提交于 2019-12-02 07:06:27
汉诺塔问题递归与非递归算法 汉诺塔问题描述如下: 有 A、B、C 3 根针,n 个圆盘(从 1..n )从上到下,按小到大顺序放在 A 处,要求每次移动一个,并保持从小到大的叠放顺序, 利用 C,把 n 个盘子移动到 B 处。 递归算法 递归算法比较容易理解 fn hanoi(n): hanoi_move(n, 'A', 'B', 'C') fn hanoi_move(n, from, to, medium): if n <= 0: return hanoi_move(n-1, 'A', 'C', 'B') println("move {} from {} to {}", n, from, to); hanoi_move(n-1, 'C', 'B', 'A') 非递归算法 重新思考整个移动过程,在处理 n 从 A 到 B 时,需要先处理其上的 n-1 个圆盘从 A 到 C,直到 A 处只剩下 1 个编号为 n 的圆盘,这个步骤定义为 Step : struct Step { n, r, from, to, medium } r 表示当前编号为 n 其上面还放着有多少个圆盘,当 r 为 1 时,就可以移动编号为 n 的圆盘了,即: Step(n, r, from, to, medium) 分解为 1. Step(r-1, r-1, from, medium, to) 2. Step

关于汉诺塔问题

巧了我就是萌 提交于 2019-12-02 04:42:46
一、由来: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根 金刚石 柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 汉诺塔问题源于递归算法,看起来很简单,想起来很麻烦,要深刻理解递归的真正含义,将第一个柱子上的所有圆盘全部拿到第三个盘子上,其实这些盘子可以抽象的分成两个部分,最底下的大盘子,和上面的小盘子. 所有盘子从柱子A移动到柱子B上 (1)当N=1 时,只有一个盘子,只需要移动一次:A—>1—>B; (2)当N=2时,则需要移动三次: A—>1—> C A —>2—>B C —>1—>B (3)如果N=3,则具体移动步骤为: A—>1—> B, A —>2—>C, B —>1—>C. (3.1) A—>3—>B. (3.2) C—>1—>A, C —>2—>B, A —>1—>B. (3.3) 就来三个盘子来看,先把最小的盘子放在第三个柱子上,再把第二个盘子放在地二个柱子上,然后把最小的那个放在第二个上,最底部的现在可以拿到第三个柱子上了,紧接着把第二个柱子上最小的盘子放在第一个柱子上,第二小的盘子放在第三个柱子上的最底部盘子的上面,再把最小的放在第三个柱子上面,我们将 三个柱子命名

[算法]汉诺塔

喜欢而已 提交于 2019-12-01 22:46:43
#include <iostream> #include <cmath> using namespace std; int hannuota(int n, string a, string b, string c) { if (n == 1) { //只有一个盘子的情况下直接将第一个塔上的盘子移动到第三个塔 printf("塔%s------>塔%s\n", a.c_str(), c.c_str()); } else { //1.先将第一个塔的n-1个盘子全部通过第三个塔移动到第二个塔上 hannuota(n - 1, a, c, b); //2.再将剩下的一个盘子移动到第三个塔上 printf("塔%s------>塔%s\n", a.c_str(), c.c_str()); //3.最后将第二个塔上的盘子通过第一个塔移动到第三个塔上 hannuota(n - 1, b, a, c); } return 1; } int main() { printf("盘子移动如下:\n"); hannuota(3, "A", "B", "C");//三个盘子,三个塔 cout << "hello world" << endl; return 0; } 来源: https://www.cnblogs.com/tailiang/p/11719524.html

python3汉诺塔简单实现代码

╄→尐↘猪︶ㄣ 提交于 2019-12-01 10:00:18
小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1, x, z, y) print(x,'-->',z) hannoi(n-1, y, x, z) n=int(input("请输入x,yz:")) hannoi(n, "X", "Y", "Z")    来源: https://www.cnblogs.com/68xi/p/11677589.html

10.12~13集训题目

半世苍凉 提交于 2019-12-01 07:48:38
Day1 A. 硬币求和 题目描述 $ Magolor $ 有一排 $ n $ 个纵截面积为 \(1\) 的硬币。这里硬币可以抽象为一个竖立着的圆柱,纵截面积就是圆柱的左视图面积。 每个硬币面值不一样,==第 \(i\) 个硬币面值是 \(i\) ==。面值越大的硬币的底面圆面积当然应该越大。具体地,面值为 \(1\) 的硬币的底面圆面积为 \(1\) 个单位圆(即半径为 \(1\) 的圆)的面积;对于所有硬币的底面圆面积正比于面值。 现在请将 \(n\) 个 硬币摞成一座塔(当然不能把硬币竖起来了),要求相邻的硬币面值差不超过 \(3\) 。求这座塔的最小高度。请下取整输出。 由于浮点数存在较大的精度误差,只要误差不超过 \(±1\) 即可。 输入格式 只有一行输入一个正整数 \(n\) 。 输出格式 只有一行输出一个非负整数表示最小高度,下取整输出。 样例输入 2 样例输出 0 样例解释 对于两个硬币的情况,第一个硬币面值为1,高度为1/2;第二个硬币面值为2,高度为 $ \sqrt{2}/4 $ 。两个硬币的面值差总是不超过3,因此怎么摞都可以,高度都是 $ 1/2+\sqrt{2}/4≈0.8535531/2+2/4≈0.853553。$ 注意下取整后输出0,当然,输出1也会被视为正确(请不要输出负数,输出负数结果的正确性不予以保证)。 更多样例下载 数据范围 10%:n