八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
scala解法
def nqueen(n:Int) : Set[List[Int]] ={ def placeQueen(k:Int) :Set[List[Int]] ={ if(k==0){ Set(List()) } else { val k_1queens:Set[List[Int]] = placeQueen(k - 1) for(quees<-k_1queens; candidate <- 1 to n if safe(candidate,quees) ) yield quees:+candidate } } placeQueen(n) } def safe(candidate:Int,queens:List[Int]) ={ (1 to queens.length) zip queens forall { case (row, col) => (queens.length + 1 - row) != Math.abs(col - candidate) && !(col equals (candidate)) } }
def print(queens:List[Int]):Unit={ for(queen<-queens){ println(Array.fill(queens.length)("*") updated(queen-1,"X") mkString("")) } println() } for(queens <- nqueen(4) if !(queens isEmpty)) print(queens)