汉诺塔

汉罗塔问题

老子叫甜甜 提交于 2020-04-08 14:27:53
问题:假设有3个分别命名为A,B,C的塔座,在塔座A上插有n个直径大小各不相同、依小到大编号为1,2,……n个圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按同样顺序叠排,圆盘移动时必须遵守下列规则:(1)每次只能移动一个圆盘;(2)圆盘可以插在A,B和C中的任一塔座上;(3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。应该怎么移动? 汉罗塔问题解析:要把n个罗盘从A柱子移动到C,可以先把上面n-1个盘子从A通过C移动到B,再将第n个盘子从A移动到C,将n-1个盘子从B通过A移动到C,对于n-1个盘子可以通过函数递归来移动。 基本实现过程: n=eval(input()) def hanoi(n,A,C,B): if n==1: print("{} --> {}".format(A,C)) else: hanoi (n-1,A,B,C) #把n-1个盘从A移动到B print("{} --> {}".format(A,C))#把第n个盘子从A移动到C hanoi(n-1,B,C,A)#把n-1个盘子从B移动到C hanoi(n,'A','C',"B") 动画实现过程: import turtle class Stack: def __init__(self): self.items = [] def isEmpty(self): return len(self.items)

汉诺塔线性问题

你。 提交于 2020-03-28 18:21:31
def hannota(n, a, c, b): if n==1: print('{}:{}->{}'.format(1,a,c)) else: hannota(n-1,a,b,c) print('{}:{}->{}'.format(n,a,c)) hannota(n-1,b,c,a) def main(): A='A' B='B' C='C' N=eval(input()) hannota(N,A,C,B) main() 来源: https://www.cnblogs.com/qq1294/p/12588449.html

用python实现汉诺塔问题

北战南征 提交于 2020-03-28 17:00:27
用动画实现汉诺塔问题: import turtle class Stack: def __init__(self): self.items = [] def isEmpty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): if not self.isEmpty(): return self.items[len(self.items) - 1] def size(self): return len(self.items) def drawpole_3():#画出汉诺塔的poles t = turtle.Turtle() t.hideturtle() def drawpole_1(k): t.up() t.pensize(10) t.speed(100) t.goto(400*(k-1), 100) t.down() t.goto(400*(k-1), -100) t.goto(400*(k-1)-20, -100) t.goto(400*(k-1)+20, -100) drawpole_1(0)#画出汉诺塔的poles[0] drawpole_1(1)

汉诺塔问题与求子集

这一生的挚爱 提交于 2020-03-24 11:55:41
汉诺塔:从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤. 思路:当只有一个盘子时,直接将盘子从左移到右;当有n个盘子时,将n-1个盘子借助右柱从左柱移到中柱,然后将第n个盘子从左柱移到右柱,最后将n-1个盘子借助左柱从中柱移到右柱. public class Hannuota { public static void f(int n, String from, String to, String help) { if(n == 1) { System.out.println("move " + 1 + " from " + from + " to " + to ); }else { f(n - 1, from, help, to); System.out.println("move " + n + " from " + from + " to " + to ); f(n - 1, help, to, from); } } public static void main(String[] args) { f(3, "左", "右", "中"); } } 运行结果: 求子集思路:在递归函数里,对于字符串中的每一个元素,有选择该元素与不选择该元素两种情况

图解汉诺塔问题( Java 递归实现)

南楼画角 提交于 2020-03-23 23:05:00
汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题——汉诺塔问题。 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 额,好吧,好像有点啰里啰嗦的。其实一句话就是,在三个柱子之间移动盘子,一次只能移动一个,并且要保证每一步上边的盘子都要比下边的盘子小,最终实现把所有的盘子都从最左边柱子移动到最右边的柱子上。 我找了一个小游戏,可以玩一下,体验一下这个过程。相信我,你玩不过第五关的!嘿嘿,玩不过再过来看一下,我是怎么给你做游戏攻略(作弊)的。 地址: http://www.4399.com/flash/109504_1.htm 我相信,有很多童鞋在学递归的时候,都会受到这个问题的困扰。别着急,你不是一个人,我第一次看到这个也是一脸懵逼,这什么鬼啊,这么复杂。下面我通过图解的方式,演示整个移动过程,帮助你理解用递归解决这个问题的思想。 汉诺塔图解 我们一步一步从简单到复杂。为了方便,我把三个柱子从左到右分别叫 A,B,C。盘子的数字从上到下依次增大。 一个盘子 只有一个盘子的时候,就比较简单了。如图

递归(走楼梯,阶乘)

隐身守侯 提交于 2020-03-17 03:51:21
递归我记得,我最先接触的递归的例子是汉诺塔。 但是本文现在不讲汉诺塔,嘿嘿! 我们从简单的开始 递归现象发生于递归函数,递归函数是直接或者间接的调用自己本身的这么一种函数。 举个例子 求从1连成乘到n的积,也就是求 n! 。其中就是重复的去用一个数乘一个数,接着再乘一个数,一直乘到100;我们用递归完成, public int recursion ( int i , int n ) { if ( i == n ) return n ; return i * recursion ( i + 1 ) ; } 函数recursion自己调用自己,这就是递归现象。 递归是一种很棒的算法思想,你只需要找到复杂问题中最小的重复单元或者说可能性单元,然后复杂的细节就交给计算机吧! 例子二,说有一个n级的台阶,每一步有两种走法,每次跨一步或者跨两步,问从第一阶开始,走到最后一阶有几种不同的走法。 我们知道,每一次向前都有两种走法,一阶或者两阶。问走到最后一阶有多少种走法,走到最后一阶就是说每次一步或者两步的一种组合只要能走到最后一阶,就算一种成功的组合。 每一步两种可能性,有n个台阶。问题是复杂的,但是其中最小的重复单元很明显,就是每次所面临的两种可能性,最后需要满足组合步数等于台阶数就行。 int ans = 0 ; //定义一个全局变量 记录符合要求的组合数 public void

汉诺塔——动画演示——C++递归详解

你。 提交于 2020-03-17 03:33:31
传说: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神 梵天 在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而 梵塔 、庙宇和众生也都将同归于尽。 问题描述: 古代有一个梵塔,塔内有三个座A,B,C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移动到C座,但规定每次只能允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。 输入: 盘子数量 输出: 移动步骤 动画演示: 代码如下: #include<iostream> using namespace std; int n; void move(char x,char y) { cout<<x<<"-->"<<y<<endl; } void hanoi(int n,char A,char B,char C) { //将n个盘子从A座借助B座移动到C座 if(n==1) move(A,C); else { hanoi(n-1,A,C,B); move(A,C);

7-17 汉诺塔的非递归实现 (25分)

亡梦爱人 提交于 2020-03-10 08:52:24
借助堆栈以非递归(循环)方式求解汉诺塔的问题(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 代码: # include <stdio.h> # define MaxSize 100 typedef struct { //汉诺塔问题结构类型 int N ; //盘数 char A ; //起始柱 char B ; //借助柱 char C ; //目标柱 } ElementType ; typedef struct { //栈的标准定义 ElementType Data [ MaxSize ] ; int Top ; } Stack ; void Push ( Stack * PtrS , ElementType item ) ; //入栈 ElementType Pop ( Stack * PtrS ) ; //出栈 void Hanoi ( int n ) ; //迭代解决并输出 int main ( ) {

面试题 08.06. 汉诺塔问题

社会主义新天地 提交于 2020-03-07 12:58:31
面试题 08.06. 汉诺塔问题 【简单题】【递归】 在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出移到下一根柱子; (3) 盘子只能叠在比它大的盘子上。 请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。 你需要原地修改栈。 输入:A = [ 2 , 1 , 0 ] , B = [ ] , C = [ ] 输出:C = [ 2 , 1 , 0 ] 输入:A = [ 1 , 0 ] , B = [ ] , C = [ ] 输出:C = [ 1 , 0 ] 题目讲解 【历史重难点题目】 历史重难点题目总结 【核心思想】 递归 【思路】 假设有n个盘子需要移动 首先将最上面的n-1个盘子从A移到B柱子 然后将最下面的一个盘子从A移到C柱子 最后将n-1个盘子从B移到C柱子 以上是汉诺塔的整体操作,其中移动n-1个盘子的操作是递归操作 【代码】 class Solution { public void hanota ( List < Integer > A , List < Integer > B , List < Integer > C ) { move ( A

关于汉诺塔,C++代码,代码效果演算

半世苍凉 提交于 2020-03-07 07:56:48
 1 .故事介绍 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上依照大小顺序摞着 64 片黄金圆盘。大梵天命令婆罗门把圆盘从以下開始按大小顺序又一次摆放在还有一根柱子上。而且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次仅仅能移动一个圆盘。 2. 由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在当中一根针上从下到上地穿好了由大到小的 64 片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在依照以下的法则移动这些金片:一次仅仅移动一片,无论在哪根针上,小片必须在大片上面。僧侣们预言,当全部的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 [1] 无论这个传说的可信度有多大,如果考虑一下把 64 片金片,由一根针上移到还有一根针上,而且始终保持上小下大的顺序。这须要多少次移动呢 ? 这里须要递归的方法。如果有 n 片,移动次数是 f(n). 显然 f(1)=1,f(2)=3,f(3)=7 ,且 f(k+1)=2*f(k)+1 。此后不难证明 f(n)=2^n-1 。 n=64 时, 假如每秒钟一次,共需多长时间呢?一个平年