Aha! Algorithms

Aha! Algorithms - Depth First Se

2017-03-17  本文已影响0人  su3

《啊哈!算法》第 4 章第 1 节,深度优先搜索的 Swift 实现。

问题

输入一个数 n,输出 1~n 的全排列

解决

假设有编号 1、2、3 张纸牌,放入 1、2、3 号盒子中,每个盒子都按照 1、2、3 的顺序依次尝试。

let n = 3 //取值范围从1~n
//下标 0 的位置没有使用,因此要初始化 n+1 项
var a = [Int](repeatElement(0, count: n+1)) //准备用来放数字的盒子
var book = [Int](repeatElement(0, count: n+1)) //记录已放入的数字

func dfs(step: Int){
    //如果站在 n+1 个盒子前,表示前 n 个盒子已经放好数字
    if step == n+1 {
        //输出一种排列
        for i in 1...n {
            print(a[i], separator: "", terminator: "")
        }
        print("\n")
        return
    }

    //此时站在地 step 个盒子前
    //按照1、2、3……的顺序一一尝试
    for i in 1...n {
//        print("step: \(step), i: \(i)")
        //判断数字是否在手上,book[i]=0表示还未放置
        if book[i] == 0 {
            a[step] = i
            book[i] = 1 //牌打出后设为1,表示牌不在手上了
            
            //走到下一个盒子前,函数递归
            dfs(step: step+1)
            //把刚才尝试的牌收回
            book[i] = 0
        }
    }
}

dfs(step: 1)

代码在 GitHub

上一篇 下一篇

猜你喜欢

热点阅读