美文网首页
Swift解决汉诺塔问题

Swift解决汉诺塔问题

作者: 汾酒iOSer | 来源:发表于2021-09-11 16:10 被阅读0次

汉诺塔来源及应用

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

图1:汉诺塔问题图示

分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:

(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;

(2)将A杆中剩下的第n号盘移至C杆;

(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。

以上摘抄自百度百科汉诺塔问题

Swift实现汉诺塔问题移动过程

直接上代码以及备注,我是在Playground上直接写的

print("汉诺塔问题,需要3个可移动盘子的柱子,那么初始需要定义3个可变数组A,B,C")

print("汉诺塔问题中盘子从小到大依次在A柱子上,那么对应数组中前元素比后元素大")
var A = [5,4,3,2,1]//举例A柱子上有5个盘子

var B : Array<Int> = []

var C : Array<Int> = []

enum Tower:String{

 case A = "A"

 case B = "B"

 case C = "C"

}

func hanoiMove(_ x : Tower,_ z : Tower){

 var xValue : Int? = nil

 switch x {

 case .A:

•    xValue = A.last;

•    A.removeLast()

•    break

 case .B:

•    xValue = B.last;

•    B.removeLast()

•    break

 case .C:

•    xValue = C.last

•    C.removeLast()

•    break

 }

 if let value = xValue {

•    switch z {

•    case .A:

•      A.append(value)

•      break

•    case .B:

•      B.append(value)

•      break

•    case .C:

•      C.append(value)

•      break

•    }

• 

 }



 print("编号\(xValue ?? 0)的盘子从\(x.rawValue)移动到\(z.rawValue)\nA:\(A)\nB:\(B)\nC:\(C)")

}

func hanoi(_ n:Int,_ x:Tower,_ y:Tower,_ z:Tower){

 if n == 1 {

•    //当n==1的时候,说明x柱子上只有1个盘子,那么直接从x柱子移动到z柱子上

•    hanoiMove(x, z)

 }else{

•    //将n-1个盘子从x柱子借助z柱子移动到y柱子上:此时x柱子还有最后一个盘子(编号为n的盘子),y柱子有n-1个盘子,z柱子上是空柱子

•    hanoi(n-1, x, z, y)

•    //此时可以直接将x柱子上最后1个盘子直接移动到z柱子上

•    hanoiMove(x, z)

•    //将y柱子上的n-1个盘子,再借助此时的空柱子x,移动到z柱子上

•    hanoi(n-1, y, x, z)

 }

}

print("汉诺塔初始状态\nA:\(A)\nB:\(B)\nC:\(C)")

print("把A柱子上的盘子经由B柱子全部移动到C柱子上移动汉诺塔过程如下")

hanoi(A.count, .A, .B, .C)//A.count A柱子上的所有盘子经由B柱子移动到C柱子上

print("至此汉诺塔移动完成\nA:\(A)\nB:\(B)\nC:\(C)")</pre>

相关文章

  • Swift解决汉诺塔问题

    汉诺塔来源及应用 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(...

  • 汉诺塔算法和背后的数据结构

    汉诺塔是有算法的。 很多问题都有解决办法,汉诺塔也不例外。如果汉诺塔的算法符合 Introduction to a...

  • 汉诺塔问题与递归

    文章也同时在个人博客 http://kimihe.com/更新 汉诺塔问题(Hanoi Tower) 汉诺塔问题的...

  • javascript解决汉诺塔问题

    递归的课后作业:解决汉诺塔问题有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆...

  • Prolog解决汉诺塔问题

    起源 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子...

  • Python使用递归解决汉诺塔问题

    汉诺塔 (http://baike.baidu.com/view/191666.htm) , 汉诺塔问题也是程序设...

  • 动态规划刷题整理(持续更新)

    (持续更新) 奇怪的汉诺塔(4柱汉诺塔) 描述汉诺塔问题,条件如下:1、这里有A、B、C和D四座塔。2、这里有n个...

  • Python汉诺塔递归算法

    汉诺塔含义: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石...

  • 一个古老而又经典的算法-汉诺塔问题

    哈诺塔问题相信只要学习计算机的人都知道。这是一个古老而又伟大的问题。在这篇文章中,主要是给出递归解决汉诺塔问题的代...

  • 图解汉诺塔问题( Java 递归实现)

    汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题——汉诺塔问题。 先看下百度百科是怎么定义汉诺塔的规...

网友评论

      本文标题:Swift解决汉诺塔问题

      本文链接:https://www.haomeiwen.com/subject/dfkawltx.html