33 lines
887 B
Plaintext
33 lines
887 B
Plaintext
(let queenPuzzle (fun (rows columns)
|
|
(if (<= rows 0)
|
|
[[]]
|
|
(addQueen (- rows 1) columns))))
|
|
|
|
(let addQueen (fun (newRow columns) {
|
|
(mut newSolutions [])
|
|
(let prev (queenPuzzle newRow columns))
|
|
|
|
(mut i 0)
|
|
(while (< i (len prev)) {
|
|
(let solution (@ prev i))
|
|
(mut newColumn 0)
|
|
(while (< newColumn columns) {
|
|
(if (not (hasConflict newRow newColumn solution)) (append! newSolutions (append solution newColumn)))
|
|
(set newColumn (+ newColumn 1)) })
|
|
|
|
(set i (+ i 1)) })
|
|
|
|
newSolutions }))
|
|
|
|
(let hasConflict (fun (newRow newColumn solution) {
|
|
(mut i 0)
|
|
(mut conflict false)
|
|
(while (and (< i newRow) (not conflict)) {
|
|
(if (or (= (@ solution i) newColumn) (= (+ (@ solution i) i) (+ newColumn newRow)) (= (- (@ solution i) i) (- newColumn newRow)))
|
|
(set conflict true))
|
|
(set i (+ i 1)) })
|
|
|
|
conflict }))
|
|
|
|
(print (queenPuzzle 4 4))
|