盘子

20190710-汉诺塔算法

匿名 (未验证) 提交于 2019-12-02 22:51:30
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界 的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵 天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘 上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 关键点: 一次只能移动一个盘子 大盘不能重叠在小盘子上 当n=1的时候 1. 直接将1从X移动到Z 当n=2的时候 1. 将1从X移动到Y轴 2. 将2从X移动到Z轴 3. 将1从Y移动到Z轴 当n=3的时候 1. 将1从X移动到Z 2. 将2从X移动到Y 3. 将1从Z移动到Y 4. 将3从X移动到Z 5. 将1从Y移动到X 6. 将2从Y移动到Z 7. 将1从X移动到Z 当n=4的时候 当前挪动的盘子为1,挪动轨迹为x==>y 当前挪动的盘子为2,挪动轨迹为x==>z 当前挪动的盘子为1,挪动轨迹为y==>z 当前挪动的盘子为3,挪动轨迹为x==>y 当前挪动的盘子为1,挪动轨迹为z==>x 当前挪动的盘子为2,挪动轨迹为z==>y 当前挪动的盘子为1,挪动轨迹为x==>y 当前挪动的盘子为4,挪动轨迹为x==>z 当前挪动的盘子为1,挪动轨迹为y==>z 当前挪动的盘子为2,挪动轨迹为y==>x 当前挪动的盘子为1,挪动轨迹为z==>x 当前挪动的盘子为3,挪动轨迹为y==>z

关于汉诺塔问题

巧了我就是萌 提交于 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-11-28 08:58:55
''' 问题: 有三个柱子A、B、C。移动n个盘子从 A -> C 分析: 步骤1: 移动前n-1个盘子 A -> B 步骤2: 移动第n个盘子 A -> C 步骤3: 移动前n-1个盘子 B -> C 实验: (n个盘子从上到下编号:1, 2, 3,...,n) n=2: move 1 A -> B 步骤1:移动前n-1个盘子 A -> B move 2 A -> C 步骤2:移动第n个盘子到 A -> C move 1 B -> C 步骤3:移动前n-1个盘子 B -> C n=3: move 1 A -> C move 2 A -> B move 1 C -> B 移动前n-1个盘子 A -> B move 3 A -> C 移动第n个盘子到 A -> C move 1 B -> A move 2 B -> C move 1 A -> C 移动前n-1个盘子 B -> C n=4: 4 A C 3 A B 4 C B 2 A C 4 B A 3 B C 4 A C 可以看到, 要把盘子A->B 要通过C, 把盘子从B->C要通过A def move(n, start,end, middle) move n start -> middle move n-1 start -> end move n middle-> end if n==1: move 1 A -> C move

递归解决汉诺塔问题

末鹿安然 提交于 2019-11-27 16:03:05
汉诺塔问题 问题描述 代码实现 问题描述 哈哈哈哈哈哈,自己去4399玩 汉诺塔游戏 代码实现 package com.wuxudong.recursion; //汉诺塔问题 public class Hanoi { public static void main(String[] args) { hanoi(5,'A','B','C'); } /** * * @param n 盘子的个数 * @param from 开始的柱子 * @param in 中间的柱子 * @param to 目标柱子 */ public static void hanoi(int n, char from,char in, char to){ //只有两个情况,只有一个盘子和其它大于一个盘子的情况 //只有一个盘子 if(n==1){ System.out.println("第1个盘子从"+from+"移动到"+to); }else { //无论有多少个盘子都看成两个盘子,上面所有n-1个盘子和下面的一个盘子 //将上面的盘子移动到中间位置 hanoi(n-1,from,to,in); //将第n个盘子移动到目标柱子 System.out.println("第"+n+"个盘子从"+from+"移动到"+to); //将中间柱子的盘子移动到目标柱子 hanoi(n-1,in,from,to); } }