经典例题-Hanoi 汉诺塔问题

1. Introduction

大梵天创造世界的时候做了三根柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

Time Complexity

假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。

Pseudocode

/**
 *
 * @param n 盘子的数目
 * @param origin 源座
 * @param assist 辅助座
 * @param destination 目的座
 */
public void hanoi(int n, char origin, char assist, char destination) {
    if (n == 1) {
        move(origin, destination);
    } else {
        hanoi(n - 1, origin, destination, assist);
        move(origin, destination);
        hanoi(n - 1, assist, origin, destination);
    }
}

思想就是把上面的n-1移到辅助座,把最底下的移到目的座。再把辅助座的移到目的座。具体怎么移动就用递归。

汉诺塔问题的研究

由问题发现每次都是先移动第一个开始,最后一次最后移动且只移动一次。

image.png

所以当问,第N个的需要移动次数,就可以使用公式了

OJ

HDU1207
HDU1995
HDU1996
HDU1997
HDU2064
HDU2077
HDU2175
HDU2184
HDU2511
HDU2587

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前置文章:递归算法:www.jianshu.com/p/703069f3ba3f . 汉诺塔问题是来源于印度传...
    郎小凯阅读 4,166评论 0 1
  • 原文链接(转载请注明出处)汉诺塔的图解递归算法 起源 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大...
    Dmego阅读 5,476评论 0 0
  • 问题描述在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在...
    Java红茶阅读 3,723评论 1 2
  • 上节回顾 前夜(3) 江小南望着亮屏的手机上那一行字,曾经心中被车轮碾压的感觉又浮了上来。分手后那些浑浑噩噩的日...
    晓兰sally阅读 2,571评论 3 3
  • 今天,在回顾昨晚,年会颁奖前后的一幕幕的时,我突然感觉自己体悟到了“平常心”。 虽说,经常都爱在各种场合,用“平常...
    辛佳璐Lucy阅读 1,163评论 0 0