Commit | Line | Data |
---|---|---|
a98cef7e KN |
1 | (define (filter predicate sequence) |
2 | (cond ((null? sequence) '()) | |
3 | ((predicate (car sequence)) | |
4 | (cons (car sequence) | |
5 | (filter predicate (cdr sequence)))) | |
6 | (else (filter predicate (cdr sequence))))) | |
7 | ||
8 | (define (accumulate op initial sequence) | |
9 | (if (null? sequence) | |
10 | initial | |
11 | (op (car sequence) | |
12 | (accumulate op initial (cdr sequence))))) | |
13 | ||
14 | (define (flatmap proc seq) | |
15 | (accumulate append '() (map proc seq))) | |
16 | ||
17 | (define (enumerate-interval low high) | |
18 | (if (> low high) | |
19 | '() | |
20 | (cons low (enumerate-interval (+ low 1) high)))) | |
21 | ||
22 | (define empty-board '()) | |
23 | ||
24 | (define (rest bs k rest-of-queens) | |
25 | (map (lambda (new-row) | |
26 | (adjoin-position new-row k rest-of-queens)) | |
27 | (enumerate-interval 1 bs))) | |
28 | ||
29 | (define (queen-cols board-size k) | |
30 | (if (= k 0) | |
31 | (list empty-board) | |
32 | (filter (lambda (positions) (safe? k positions)) | |
33 | (flatmap (lambda (r) (rest board-size k r)) | |
34 | (queen-cols board-size (- k 1)))))) | |
35 | ||
36 | (define (queens board-size) | |
37 | (queen-cols board-size board-size)) | |
38 | ||
39 | (define (adjoin-position new-row k rest-of-queens) | |
40 | (append rest-of-queens (list new-row))) | |
41 | ||
42 | (define (safe? k positions) | |
43 | (let ((new (car (last-pair positions))) | |
44 | (bottom (car positions))) | |
45 | (cond ((= k 1) #t) | |
46 | ((= new bottom) #f) | |
47 | ((or (= new (- bottom (- k 1))) (= new (+ bottom (- k 1)))) #f) | |
48 | (else (safe? (- k 1) (cdr positions)))))) | |
49 | ||
50 | (test (queens 4) '((2 4 1 3) (3 1 4 2))) |