Swift解决汉诺塔问题

汉诺塔来源及应用

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

推荐阅读更多精彩内容

  • 我的博客:递归之汉诺塔问题 一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的...
    taylar_where阅读 974评论 1 3
  • 起源 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子...
    小白frankie阅读 3,543评论 0 2
  • 前置文章:递归算法:www.jianshu.com/p/703069f3ba3f . 汉诺塔问题是来源于印度传...
    郎小凯阅读 804评论 0 1
  • 递归的课后作业:解决汉诺塔问题有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆...
    清汤饺子阅读 516评论 0 0
  • 汉诺塔 汉诺塔问题是递归算法学习的一个经典案例,首先来看下汉诺塔问题的相关描述: 汉诺塔问题起源于一个古老的印度传...
    木人张阅读 1,047评论 0 1