エイトクイーン問題 by Scala

方針


パターンマッチを上手く使う。
斜め方向は、網目探索にならないように関数を渡して演算を固定する。
(書いた当時はScala初心者なので上手い方法あったら教えてください。)


サンプルコード

object EightQueen {

    def check(number: Int, f: Int=>Int, list: List[Int] ) : Boolean = { list match     {
            case head :: tail if head == number => true
            case head :: tail => check( f(number), f, tail )
            case _ => false
        }
    }

    def queens(number: Int, list: List[Int] ) : Int = { number match { 
            case n if list.exists( _ == n ) => 0
            case n if check( n+1, x=>x+1, list ) => 0
            case n if check( n-1, x=>x-1, list ) => 0
            case n if ( n :: list ).length == 8  => 1
            case n => ( 0 to 7 ).foldLeft(0){ (i,t) => i + queens( t, n :: list ) }
        }
    }

    def queens() : Int = ( 0 to 7 ).foldLeft(0){ (i,t) => i + queens( t, Nil ) }
    def main(args: Array[String]) : Unit = println( queens() )
}


DataListってやってるのは、最初が小文字だとパターンマッチがうまくいかない罠。回避方法はあるのかな?
小文字でもうまくいった。ifの前だといけないっぽい。


checkでnumberが負数になる時の枝きりをしていませんが、パターン数少ないので大丈夫…。