Scheme 球拍:N个皇后按列解决
我是个新手,作为我的第一个半复杂程序之一,我试图通过线性遍历列来解决N queens问题;因此,结果将是一个列表2 4 1 3,例如,其中2是第4列,第2行,4是第3列,第4行,等等。我的程序目前是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
#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皇后的解决方案数。这并不意味着不能删减搜索空间,但必须搜索不能删减的内容,因为其中可能隐藏着一个或多个解决方案。对代码进行注释会很有帮助。