Vector 如何求解方案中的n皇后

Vector 如何求解方案中的n皇后,vector,scheme,n-queens,Vector,Scheme,N Queens,我正试图解决方案中的n皇后问题。我的教授告诉我使用一个向量作为棋盘,向量的第I个元素代表棋盘的第I列。该元素的值是皇后所在的行,如果列为空,则为-1。因此,[012-1-1]有两列没有皇后,三列皇后被非法放置。 当我运行这个代码时:(place-n-queens044(-1-1-1-1-1)),我得到了#(0123),显然这四个queens都是非法放置的。我认为问题在于我没有在cond-in-place-queen-on-n中检查足够的内容,但我不确定要添加什么来解决将queen放在同一对角线上

我正试图解决方案中的n皇后问题。我的教授告诉我使用一个向量作为棋盘,向量的第I个元素代表棋盘的第I列。该元素的值是皇后所在的行,如果列为空,则为-1。因此,[012-1-1]有两列没有皇后,三列皇后被非法放置。 当我运行这个代码时:(place-n-queens044(-1-1-1-1-1)),我得到了#(0123),显然这四个queens都是非法放置的。我认为问题在于我没有在cond-in-place-queen-on-n中检查足够的内容,但我不确定要添加什么来解决将queen放在同一对角线上的问题

(define (return-row vector queen) 
  (vector-ref vector (return-col vector queen)))
(define (return-col vector queen) 
  (remainder queen (vector-length vector)))

(define (checkrow vector nq oq) 
  (cond
   ((= (vector-ref vector nq) -1) #f)
   ((= (vector-ref vector oq) -1) #f)
   (else (= (return-row vector nq) (return-row vector oq)))))
(define (checkcol vector nq oq) 
  (= (return-col vector nq) (return-col vector oq)))
(define (checkdiagonal vector nq oq)
  (cond 
    ((= (vector-ref vector nq) -1) #f)
    ((= (vector-ref vector oq) -1) #f)
    (else (= (abs (- (return-row vector nq) (return-row vector oq)))
      (abs (- (return-col vector nq) (return-col vector oq)))))))

(define (checkdiagonalagain vector r c oq)
   (= (abs (- r (return-row vector oq)))
    (abs (- c (return-col vector oq)))) )
(define (checkrowagain vector r oq)
   (= r (return-row vector oq)))

(define (checkinterference vector nq oq)
   (or (checkrow vector nq oq) (checkcol vector nq oq) (checkdiagonal vector nq oq)))

(define (place-queen-on-n vector r c)
 (local ((define (foo x)
        (cond
          ((checkrowagain vector r x) -1)            
          ((= c x) r)
          ((checkinterference vector c x) -1)
          ((map (lambda (y) (eq? (vector-ref vector x) y)) 
                (build-list (vector-length vector) values)) (vector-ref vector x))
          ((eq? (vector-ref vector x) -1) -1)
          (else -1))))
 (build-vector (vector-length vector) foo)))

(define (place-a-queen vector)
 (local ((define (place-queen collist rowlist)
        (cond
          ((empty? collist) '())
          ((empty? rowlist) '())
          (else (append (map (lambda (x) (place-queen-on-n vector x (car collist))) rowlist)
                        (try vector (cdr collist) rowlist)))
          )))
 (place-queen (get-possible-col vector) (get-possible-row (vector->list vector) vector))))

(define (try vector collist rowlist)
 (cond
  ((empty? collist) '())
          ((empty? rowlist) '())
 (else (append (map (lambda (x) (place-queen-on-n vector x (car collist))) rowlist)
    (try vector (cdr collist) rowlist)))))

(define (get-possible-col vector)
 (local ((define (get-ava index)
        (cond
          ((= index (vector-length vector)) '())
          ((eq? (vector-ref vector index) -1)
           (cons index (get-ava (add1 index))))
          (else (get-ava (add1 index))))))
  (get-ava 0)))

;list is just vector turned into a list
(define (get-possible-row list vector)
  (filter positive? list)
  (define (thislist) (build-list (vector-length vector) values))
  (remove* list (build-list (vector-length vector) values))
)

(define (place-n-queens origination destination vector)
 (cond
  ((= origination destination) vector)
  (else (local ((define possible-steps
                (place-n-queens/list (add1 origination)
                                     destination
                                     (place-a-queen vector))))
        (cond
          ((boolean? possible-steps) #f)
          (else possible-steps))))))

(define (place-n-queens/list origination destination boards)
 (cond
  ((empty? boards) #f)
  (else (local ((define possible-steps 
                (place-n-queens origination destination (car boards))))         
        (cond
          ((boolean? possible-steps) (place-n-queens/list origination destination (cdr boards)))
          (else possible-steps))
        ))))

我们非常感谢您的帮助,让这项工作顺利进行

这很难理解。一般来说,n-queens是通过某种回溯来完成的,我不知道你在哪里回溯。困难的部分是管理使用向量时的副作用。在返回之前,必须将电路板设置为先前的状态

(define (n-queens size)
 (let ((board (make-vector size -1)))
   (let loop ((col 0) (row 0))
     (cond ((= col size) board)
           ((= row size)    ;;dead end
            (if (= col 0)   ;;if first collumn
                #f          ;;then no solutions
                (begin (vector-set! board (- col 1) -1))
                       #f)))            
                  ;;else undo changes made by previous level and signal the error
           ((safe? col row board) 
            (vector-set! board col row) 
            (or (loop (+ col 1) 0) 
                   ;;only precede to next column if a safe position is found
                (loop col (+ row 1))))
                   ;; keep going if hit a dead end. 
           (else (loop col (+ row 1)))))))
书写安全吗?但这取决于你

也不确定为什么要从向量移动到列表。这真的把逻辑搞乱了,所以我跟不上。另外,你应该能够自己轻松地通过向量。在
place-queen-on-n
中,您可以在向量上使用构建列表,以便在向量上进行映射。 而某种向量折叠可能更合适。此外,map将始终返回一个列表,该列表始终不为false,这意味着cond中之后的任何代码都不会被命中。这是你的问题吗,我不知道,但这是个问题