N-Queens计划:试图打印出棋盘

时间:2014-12-02 23:44:53

标签: vector scheme n-queens

它工作正常,我已经手动检查一切正在运行,但我现在需要弄清楚如何在时尚的棋盘上打印出答案,我有一个nxn的0&0; s和1&1;其中1是皇后。我正在使用向量,例如我可以说我为5x5板运行nq-bt我得到答案:#(0 2 4 1 3)

nq-bt是给出上面答案的方法

这是我试图让它工作的伪代码:

(define (print-answer n)
    (make n equal to the returned vector of method (nq-bt))
    (loop until it hits end of the returned vector_length)
       (set value equal to (vector ref of n (*variable used for first loop)))
       (loop again the length of returned vector_length)
           (print 0's until hits vector ref's value, then print 1, then print 0's till end of loop)
           (print newline)))))

我知道这是疯狂的伪代码,但我的问题是我不习惯计划,并且没有太多关于我如何做这些的文档。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你没有提到你正在使用哪种Scheme解释器,所以首先我将向你展示一个使用标准程序的通用解决方案。对于初学者,我们必须决定 我们将如何循环遍历向量(例如,使用命名的let)。

另请注意,我更改了输入参数,如果我们通过了电路板的解决方案会更容易,此外如果n没有,我看不出如何使用电路板的大小nq-bt将其作为参数接收(我希望nq-bt未从全局n获取define,这是不正确的:

(define (print-answer board)
  (let outer-loop ((i 0))
    (cond ((< i (vector-length board))
           (let ((queen (vector-ref board i)))
             (let inner-loop ((j 0))
               (cond ((< j (vector-length board))
                      (display (if (= queen j) 1 0))
                      (display " ")
                      (inner-loop (+ j 1))))))
           (newline)
           (outer-loop (+ i 1))))))

现在,如果你很幸运并使用Racket,我们可以编写一个更简单,更惯用的实现,而不需要以前解决方案的所有功能:

(define (print-answer board)
  (for ([i (in-range (vector-length board))])
    (let ([queen (vector-ref board i)])
      (for ([j (in-range (vector-length board))])
        (printf "~a " (if (= queen j) 1 0))))
    (newline)))

无论哪种方式,我们都可以使用print-answer返回的结果调用nq-bt。例如:

(print-answer '#(0 2 4 1 3))

1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0