summaryrefslogtreecommitdiff
path: root/coding-exercises/2/42.rkt
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2023-03-18 21:27:40 +0100
committerMike Vink <mike1994vink@gmail.com>2023-03-18 21:27:40 +0100
commit3a4f2b08233e6c7466b70a6807a158945184899a (patch)
tree8ad0c5e5a056d487fa60ae2997bcde73e6b30f2d /coding-exercises/2/42.rkt
parent1250939951cf17c168c6728cc916c055fa2e20c4 (diff)
eight queen puzzle analysis
Diffstat (limited to 'coding-exercises/2/42.rkt')
-rw-r--r--coding-exercises/2/42.rkt44
1 files changed, 44 insertions, 0 deletions
diff --git a/coding-exercises/2/42.rkt b/coding-exercises/2/42.rkt
new file mode 100644
index 0000000..eb1a5fc
--- /dev/null
+++ b/coding-exercises/2/42.rkt
@@ -0,0 +1,44 @@
+#lang racket
+(require "../../shared/lists.rkt")
+
+(define (adjoin-position new-row k rest-of-queens)
+ (cons (list new-row k) rest-of-queens))
+
+(define (safe? k positions)
+ (let ((maybe-new-queen (car positions))
+ (rest-of-queens (cdr positions)))
+ (fold-right (lambda (queen safe)
+ (let ((dx (abs (- (car queen) (car maybe-new-queen)))))
+ (and
+ safe
+ (not (or (= dx 0) (= dx (- k (cadr queen))))))))
+ true
+ rest-of-queens)))
+
+((lambda ()
+ (newline)
+ (display "safe?-test")
+ (newline)
+ (display (safe? 2 (list (list 1 2) (list 1 1) (list 0 0))))
+ (display (safe? 2 (list (list 1 2) (list 1 1) (list 1 0))))
+ (display (safe? 2 (list (list 1 2) (list 1 1) (list 2 0))))
+ (display (safe? 2 (list (list 5 2) (list 1 1) (list 3 0))))
+ (display (safe? 6 (list (list 6 6) (list 5 5) (list 4 4))))))
+
+(define empty-board '())
+
+(define (queens board-size)
+ (define (queen-cols k)
+ (if (= k 0)
+ (list empty-board)
+ (filter
+ (lambda (positions) (safe? k positions))
+ (flatmap
+ (lambda (rest-of-queens)
+ (map (lambda (new-row)
+ (adjoin-position new-row k rest-of-queens))
+ (enumerate-interval 1 board-size)))
+ (queen-cols (- k 1))))))
+ (queen-cols board-size))
+
+(length (queens 8))