1:
2:
3:
4:
5:
6: (define (decr x) (- x 1))
7: (define (incr x) (+ x 1))
8:
9:
10: (do ((last (decr (vector-length x)))
11: (x0 (vector-ref x pos))
12: (i pos (incr i)))
13: ((= i last) (vector-set! x last x0))
14: (vector-set! x i (vector-ref x (incr i)))))
15:
16:
17: (let ((last (decr (vector-length x))))
18: (if (= pos last)
19: (func x)
20: (do ((i pos (incr i)))
21: ((< last i) #f)
22: (rotrec func x (incr pos))
23: (rotate x pos)))))
24:
25:
26: (define (genpat n)
27: (let ((x (make-vector n)))
28: (do ((i 0 (incr i)))
29: ((= n i) x)
30: (vector-set! x i i))))
31:
32:
33: (define (checkqueen p)
34: (define (loop i diag0 diag1)
35: (let* ((x (decr i))
36: (y (vector-ref p x))
37: (d0 (+ x y))
38: (d1 (- x y)))
39:
40: (and (not (or (memv d0 diag0)
41: (memv d1 diag1)))
42: (loop (decr i) (cons d0 diag0) (cons d1 diag1))))))
43: (loop (vector-length p) '() '()))
44:
45:
46: (let ((result '()))
47: (rotrec (lambda (p)
48: (if (checkqueen p)
49: (set! result
50: (cons (vector->list p) result))))
51: (genpat n) 0)
52: result))
53:
54:
55:
56:
57: (define (main args)
58: (display (nqueen 8))
59: (newline)
60: 0)