エイトクイーン問題 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が負数になる時の枝きりをしていませんが、パターン数少ないので大丈夫…。