首页 > 其他 > 详细

汉诺塔问题

时间:2020-09-02 09:19:23      阅读:58      评论:0      收藏:0      [点我收藏+]

问题概述与规则

假设有三根柱子要求,将A柱子上的所有盘子移动到B柱子上;
n个盘子标记为1, 2, 3, .... n ;
三个柱子标记为 A、B、C ;
初始状态所有的盘子都在A柱子上 ;

  • 移动磁盘条件
    1. 一次只能移动一个磁盘
    2. 不能在较小的磁盘上放置较大的磁盘

  • 理论主题
    1. 递归函数和堆栈
    2. 递归关系

图示

A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
初始状态
初始状态
A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
第一步
第一步
A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
第二步
第二步
目标: 将A柱子上的盘子移动到B柱子上
目标: 将A柱子上的盘子移动到B柱子上(C柱子作为辅助)
A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
第三步
第三步
A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
第四步
第四步
A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
第五步
第五步
A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
第六步
第六步
A柱子
A柱子
B柱子
B柱子
C柱子
C柱子
第七步
第七步
Viewer does not support full SVG 1.1

问题拆解(n为盘子个数)

  • n = 1: 当直接将盘子从A(起始柱子) 移到B(目标柱子)

  • n > 1: 将问题从宏观考虑
    1. 借助柱子B将n-1个盘子从A柱子移动到C柱子
    2. 此时A柱子上只有一个盘子直接移动到B(目标柱子)
    3. 借助柱子A将n-1个盘子从C柱子移动到B柱子

Java代码实现

技术分享图片

疑惑点:

  1. 一定要确定好哪个是起始柱子哪个是目标柱子;

  2. Java中的值传递技术分享图片

参考:

汉诺塔问题

原文:https://www.cnblogs.com/openmind-ink/p/13599799.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!