picrin/etc/R7RS/src/nqueens.sch

48 lines
1.2 KiB
Scheme

;;; NQUEENS -- Compute number of solutions to 8-queens problem.
(import (scheme base)
(scheme read)
(scheme write))
(define trace? #f)
(define (nqueens n)
(define (iota1 n)
(let loop ((i n) (l '()))
(if (= i 0) l (loop (- i 1) (cons i l)))))
(define (my-try x y z)
(if (null? x)
(if (null? y)
(begin (if trace? (begin (write z) (newline))) 1)
0)
(+ (if (ok? (car x) 1 z)
(my-try (append (cdr x) y) '() (cons (car x) z))
0)
(my-try (cdr x) (cons (car x) y) z))))
(define (ok? row dist placed)
(if (null? placed)
#t
(and (not (= (car placed) (+ row dist)))
(not (= (car placed) (- row dist)))
(ok? row (+ dist 1) (cdr placed)))))
(my-try (iota1 n) '() '()))
(define (main)
(let* ((count (read))
(input1 (read))
(output (read))
(s2 (number->string count))
(s1 (number->string input1))
(name "nqueens"))
(run-r7rs-benchmark
(string-append name ":" s1 ":" s2)
count
(lambda () (nqueens (hide count input1)))
(lambda (result) (= result output)))))
(include "src/common.sch")