Swift-汉诺塔

题目:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.

一般是通过递归来解决汉诺塔问题,也可以让汉诺塔问题更加面向对象一点,将塔作为对象.

解法一

核心代码:
<pre><code>` func moveTopTo(original:Tower,destination:Tower) {
if original.disks.count == 0 {
return
}
let top:Int = original.disks.last!
original.disks.removeLast()
destination.add(n: top)
print("(original.name)塔移动到→(destination.name)")
}

func moveDisks(disks:Int,original:Tower,destination:Tower,buffer:Tower) {
    if disks == 1 {
        moveTopTo(original: original, destination: destination)
        return
    }
    
    moveDisks(disks: disks - 1, original: original, destination: buffer, buffer: destination)
    moveDisks(disks: 1, original: original, destination: destination, buffer: buffer)
    moveDisks(disks: disks - 1, original: buffer, destination: destination, buffer: original)
    
}

func move(diskCount:Int) {
    
    var towers:[Tower] = []
    towers.append(Tower(towerName: "A"))
    towers.append(Tower(towerName: "B"))
    towers.append(Tower(towerName: "C"))
    
    let tower:Tower = towers[0]
    for i in (0..<diskCount).reversed() {
        tower.add(n: i)
    }
    
    moveDisks(disks: diskCount, original: towers[0], destination: towers[2], buffer: towers[1])
    
    
    print("FlyElephant--------------")
}`</code></pre>

解法二

核心代码:
<pre><code>` func move2(diskCount:Int) {

    var towers:[Tower] = []
    towers.append(Tower(towerName: "A"))
    towers.append(Tower(towerName: "B"))
    towers.append(Tower(towerName: "C"))
    
    for i in (0..<diskCount).reversed() {
        towers[0].add(n: i)
    }
    
    towers[0].moveDisks(n: diskCount, destination: towers[2], buffer: towers[1])
}`</code></pre>

汉诺塔对象:
<pre><code>`class Tower {

var name:String = ""
var disks:[Int] = []

init(towerName:String) {
    name = towerName
}

func add(n:Int) {
    if disks.count > 0 {
        let top:Int = disks.last!
        if n >= top {
            return
        }
        disks.append(n)
    } else {
        disks.append(n)
    }
}

func moveTopTo(tower:Tower) {
    if disks.count == 0 {
        return
    }
    let top:Int = disks.last!
    disks.removeLast()
    tower.add(n: top)
    print("\(self.name)塔移动到→\(tower.name)")
}

func moveDisks(n:Int,destination:Tower,buffer:Tower) {
    
    if n > 0 {
        moveDisks(n: n - 1, destination: buffer, buffer: destination) // n-1 个盘子移动到缓冲区
        
        moveTopTo(tower: destination)
        
        buffer.moveDisks(n: n - 1, destination: destination, buffer: self) // n-1 个盘子从缓冲区移动到目标区域
    }
}

}`</code></pre>

测试代码:
<pre><code>var hanoi:Hanoi = Hanoi() hanoi.move(diskCount: 3) hanoi.move2(diskCount: 3)</code></pre>

FlyElephant.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • 原文链接(转载请注明出处)汉诺塔的图解递归算法 起源 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大...
    Dmego阅读 1,535评论 0 0
  • 前置文章:递归算法:www.jianshu.com/p/703069f3ba3f . 汉诺塔问题是来源于印度传...
    郎小凯阅读 759评论 0 1
  • 当一个问题规模比较大且不易求解的时候,就可以考虑将问题分成几个小的模块,逐一求解。分治思想和递归算是有亲兄弟的关系...
    NotFunGuy阅读 1,239评论 0 5
  • 汉诺塔含义: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石...
    kevin282阅读 561评论 0 0
  • 上篇文写过,我们童年有四个小孩,经常在一起玩耍,今天再写写我们的童趣。 (先向没看过前篇的朋友介绍一下,我们四人同...
    乡村田野阅读 831评论 3 8