2014-12-02 58 views
0

它工作正常,我手动检查一切正在运行,但我现在需要弄清楚如何在时尚等棋盘上打印出答案。 0和1的nxn板,其中1是皇后。我使用的载体和例如可以说我运行NQ-BT为5x5的板我得到答案:#(0 2 4 1 3)N皇后计划:试图打印出棋盘

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

您没有提及您使用的是哪一个Scheme解释器,所以首先我会向您展示一个使用标准过程的通用解决方案。对于初学者,我们必须决定我们将如何遍历向量(例如,使用命名为let s)。

另请注意,我更改了输入参数,如果我们通过了电路板的解决方案,它更容易,除非我看不到如何使用电路板的尺寸n,如果nq-bt没有收到它作为参数(I希望nq-bt没有从全球define获得n,那会不会是正确的):

(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)))))) 

现在,如果你运气好,用球拍我们可以写一个更简单,更地道的实施没有所有的杂牌以前的解决方案:

(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