(define n-queens (lambda (n) (define try-next-solution (lambda (queens-so-far start-row in-column) ;(display (list queens-so-far start-row in-column)) (newline) (if (> in-column n) queens-so-far (if (<= start-row n) (if (safe? start-row in-column queens-so-far) (try-next-solution (cons (cons start-row in-column) queens-so-far) 1 (+ in-column 1) ) (try-next-solution queens-so-far (+ start-row 1) in-column)) (if (null? queens-so-far) #f (try-next-solution (cdr queens-so-far) (+ 1 (caar queens-so-far)) (cdar queens-so-far))))))) (try-next-solution '() 1 1))) (define safe? (lambda (row col list) (cond ((null? list) #t) ((= row (caar list)) #f) ((same-diagonal? row col (caar list) (cdar list)) #f) ((same-left-d? row col (caar list) (cdar list)) #f) (else (safe? row col (cdr list)))))) (define same-diagonal? (lambda (r1 c1 r2 c2) (= (- c1 r1) (- c2 r2)))) (define same-left-d? (lambda (r1 c1 r2 c2) (= (- r1 r2) (- c2 c1))))