(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))