Scheme 球拍:N个皇后按列解决

Scheme 球拍:N个皇后按列解决,scheme,lisp,racket,Scheme,Lisp,Racket,我是个新手,作为我的第一个半复杂程序之一,我试图通过线性遍历列来解决N queens问题;因此,结果将是一个列表2 4 1 3,例如,其中2是第4列,第2行,4是第3列,第4行,等等。我的程序目前是 #lang racket (define (enumerate-interval l h) (if (> l h) '() (cons l (enumerate-interval (+ l 1) h)))) (define (iperm l a) (if (null? l) (li

我是个新手,作为我的第一个半复杂程序之一,我试图通过线性遍历列来解决N queens问题;因此,结果将是一个列表2 4 1 3,例如,其中2是第4列,第2行,4是第3列,第4行,等等。我的程序目前是

#lang racket

(define (enumerate-interval l h)
  (if (> l h) '() (cons l (enumerate-interval (+ l 1) h))))

(define (iperm l a)
  (if (null? l) (list '()) (append-map (lambda (x)
                                  (map (lambda (p) (cons x p))
                                       (iperm (remove x l) (cons x a))))
                                l)))

(define (diagonal? col a)
  (cond
    ((null? a) #f)
    ((and (not (eq? col (+ (car a) (length a))))
          (not (eq? col (- (car a) (length a))))
          (diagonal? col (cdr a))) #f)
    (else #t)))

(define (iqueens l a)
  (if (null? l) (list '()) (append-map (lambda (x)
                                      (map (lambda (p) (cons x p))
                                           (if (diagonal? x a) 
                                               '()
                                               (iqueens (remove x l) (cons x a)))))
                                    l)))

(define (q n)
  (iqueens (enumerate-interval 1 n) '()))

我希望它返回所有的解决方案,或者在调用qn时符合条件的置换,n是nxn板上的皇后数。我的谓词是对角的吗?看起来很有效。我的问题是iquien的结构。当部分置换不能解决问题时,我想返回null,但作为序列编程新手,我不确定我是否知道如何设置它。

返回所有解决方案需要覆盖所有搜索空间,因为没有已知的方法根据N的值确定N皇后的解决方案数。这并不意味着不能删减搜索空间,但必须搜索不能删减的内容,因为其中可能隐藏着一个或多个解决方案。对代码进行注释会很有帮助。