- 主题:N Queen Problem in Swift functional programming
func Q(_ n:Int,_ x:Int=0,_ a:[Int]=[])->[[Int]]{
x==n ?[a]:(0..<n).filter{(y:Int)in !a.contains(y)&&(0..<x).filter{x-$0==abs(y-a[$0])}.isEmpty}.flatMap{Q(n,x+1,a+[$0])}
}
--
FROM 219.79.94.*
不错不错!
【 在 MarioSister (每天爱你多一些) 的大作中提到: 】
: func Q(_ n:Int,_ x:Int=0,_ a:[Int]=[])->[[Int]]{
: x==n ?[a]:(0..<n).filter{(y:Int)in !a.contains(y)&&(0..<x).filter{x-$0==abs(y-a[$0])}.isEmpty}.flatMap{Q(n,x+1,a+[$0])}
: }
: ...................
--
FROM 101.88.39.*
来一个Scala版本:
//
def nQueens(n: Int): Iterator[Seq[Int]] =
(0 until n).permutations.filter(_.zipWithIndex.flatMap{ (c, d) => Seq(n+c+d, c-d) }.toSet.size == 2*n)
--
FROM 183.192.22.*
swift 的类型推断又进步了,以前我一直想去掉 y的类型自定义。发现最新版的iPad Swift Playground现在可以了。
其实我最想去掉参数和函数返回值的类型自定义。c表示现在去到第几列(或者是树结构的第几层)。
func Q(_ n: Int, _ c: Int=0, _ a: [Int]=[]) -> [[Int]] {
c == n ? [a] : (0..<n).filter{y in (0..<c).filter{x in y==a[x] || c-x == abs(y - a[x])}.isEmpty}.flatMap{Q(n,c+1,a+[$0])}
}
print(Q(8))
y==a[x] 用来过滤掉在同一行(高度) 的 y,
c-x == abs(y - a[x]) 用来过滤掉在对角线上的y。
【 在 MarioSister 的大作中提到: 】
: func Q(_ n:Int,_ x:Int=0,_ a:[Int]=[])->[[Int]]{
: x==n ?[a]:(0..<n).filter{(y:Int)in !a.contains(y)&&(0..<x).filter{x-$0==abs(y-a[$0])}.isEmpty}.flatMap{Q(n,x+1,a+[$0])}
: }
: ...................
--
FROM 72.255.253.*