let rec safe x y posl = match posl with (x1,y1) :: xs -> x <> x1 (* not same column *) && y <> y1 (* not same row *) && y - x <> y1 - x1 (* not on /-diagonal *) && y + x <> y1 + x1 (* not on \-diagonal *) && safe x y xs | _ -> true exception Conflict let queens4 n = let rec queens x y posl = if x > n then posl (* 1 *) else if y > n then raise Conflict (* 2.b *) else try if safe x y posl (* 2.a *) then queens (x+1) 1 ((x,y) :: posl) else raise Conflict with Conflict -> queens x (y+1) posl in queens 1 1 [] let doit = let sol = queens4 (int_of_string(Sys.argv.(1))) in let printPair (x, y) = (print_int x; print_string ", "; print_int y; print_newline()) in List.iter printPair sol