(define (solve n)
(define (check board row i)
(cond ((null? board) #t)
((let ((next (car board)))
(or (= next row)
(= next (+ row i))
(= next (- row i)))) #f)
(else (check (cdr board) row (+ i 1)))))
(define (row-loop board i l)
(cond ((= n l) (list board))
((< i n)
(let ((next (row-loop board (+ i 1) l)))
(if (check board i 1)
(append (row-loop (cons i board) 0 (+ l 1)) next)
next)))
(else '())))
(row-loop '() 0 0))