2014-12-02 1 views
0

잘 작동하고 있으며 모든 것이 실행 중임을 수동으로 확인했지만 지금은 패션과 같은 체스 판에 대답을 인쇄하는 방법을 알아야합니다. 0과 1의 nxn 보드. 1은 여왕이다. 내가 벡터를 사용하여 예를 들어 내가 NQ-BT 내가 대답 얻을 5 × 5 보드 실행 말할 수 있어요 : # (0 2 4 1 3)N-Queens Scheme : 체스 판을 인쇄하려고합니다.

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)를 사용하여 루프를 반복 할 것입니다.

또한 입력 매개 변수를 변경했음을 알 수 있습니다. 보드의 솔루션을 전달하면 보드의 크기를 어떻게 사용할 수 있는지 쉽게 알 수 있습니다. nq-bt이 매개 변수로 수신되지 않는 경우 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)))))) 

을 지금, 당신이 운이 좋다하고 라켓을 사용하는 경우 우리는 모든 kludge없이 간단하고 관용적 구현을 ​​쓸 수 있습니다 이전 솔루션 :

(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 
관련 문제