八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,
问有多少种摆法?
def nqueens(n:Int):Set[List[Int]] ={ def placeQueen(k:Int):Set[List[Int]] ={ if(k==0) Set(List()) else{ val k_1_queens = placeQueen(k-1) for( queens <- k_1_queens; candidate <- 1 to n if safe(candidate,queens) )yield queens :+ 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 <- nqueens(8) if !(queens isEmpty)) print(queens) //nqueens(8)