Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Brushing up on “whiteboard coding” for internal interviews… Inspired by Hal Ableson’s streams-based solution to this old classic in the SICP lectures, here’s a pretty concise n-Queens solution:
let rec Solutions n board size = seq { // board is (x,y) tuple list of queens
let safe board (x,y) = // is particular square safe on given board
List.forall (fun (a,b) -> (x<>a)&&(y<>b)&&(abs(x-a)<>abs(y-b))) board
let squares size = seq { // all squares on size x size board
for y in [0..size-1] do for x in [0..size-1] do yield (x,y) }
if n <= 0 then yield board else // no more queens to add, solved!
for p in Seq.filter (safe board) (squares size) do
yield! Solutions (n-1) (p::board) size } // add queen & recurse
// 8 queens, starting from empty 8x8 board, first 10 solutions
Solutions 8 [] 8 |> Seq.take 10 |> Seq.iter (printfn "Solution: %A")
Comments
- Anonymous
October 06, 2010
The comment has been removed