它工作正常,我已经手动检查一切正在运行,但我现在需要弄清楚如何在时尚的棋盘上打印出答案,我有一个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)))))
我知道这是疯狂的伪代码,但我的问题是我不习惯计划,并且没有太多关于我如何做这些的文档。任何帮助将不胜感激。
答案 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