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

推荐阅读更多精彩内容

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