You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.1 KiB
Racket
36 lines
1.1 KiB
Racket
#lang debug racket
|
|
(require sugar/debug "hacs.rkt")
|
|
|
|
(current-inference forward-check)
|
|
(current-select-variable mrv)
|
|
(current-order-values shuffle)
|
|
|
|
;; queens problem
|
|
;; place queens on chessboard so they do not intersect
|
|
|
|
(define board-size 10)
|
|
|
|
(define queens (make-csp))
|
|
(define qs (range board-size))
|
|
(define rows (range (length qs)))
|
|
(add-vars! queens qs rows)
|
|
(for* ([qs (in-combinations qs 2)])
|
|
(match-define (list qa qb) qs)
|
|
(add-constraint! queens
|
|
(λ (qa-row qb-row)
|
|
(not (= (abs (- qa-row qb-row)) (abs (- qa qb))))) ; same diag?
|
|
(list qa qb)))
|
|
(add-all-diff-constraint! queens #:proc eq?)
|
|
|
|
(define (sol->string sol)
|
|
(define assocs (csp->assocs sol))
|
|
(displayln (string-join (for/list ([q (in-list (sort assocs < #:key car))])
|
|
(apply string (add-between (for/list ([idx (in-range board-size)])
|
|
(if (= idx (cdr q)) #\@ #\·)) #\space))) "\n"))
|
|
assocs)
|
|
|
|
(current-thread-count 4)
|
|
(parameterize ([current-solver min-conflicts-solver])
|
|
(time (solve queens #:finish-proc sol->string)))
|
|
|