Four Knightsの問題のために3x3チェスボードを取得しようとしています。ここでは、コードラケット言語DrRacketのエラーを理解できません
#lang racket
(define N 3)
(define nexts ; construct the graph
(let ([ds (for*/list ([x 2] [x* '(+1 -1)] [y* '(+1 -1)])
(cons (* x* (+ 1 x)) (* y* (- 2 x))))])
(for*/vector ([i N] [j N])
(filter values (for/list ([d ds])
(let ([i (+ i (car d))] [j (+ j (cdr d))])
(and (< -1 i N) (< -1 j N) (+ j (* N i)))))))))
(define (tour x y)
(define xy (+ x (* N y)))
(let loop ([seen (list xy)] [ns (vector-ref nexts xy)] [n (sub1 (* N N))])
(if (zero? n) (reverse seen)
(for/or ([next (sort (map (λ(n) (cons n (remq* seen (vector-ref nexts n)))) ns)
< #:key length #:cache-keys? #t)])
(loop (cons (car next) seen) (cdr next) (sub1 n))))))
(define (draw tour)
(define v (make-vector (* N N)))
(for ([n tour] [i (in-naturals 1)]) (vector-set! v n i))
(for ([i N])
(displayln (string-join (for/list ([j (in-range i (* N N) N)])
(~a (vector-ref v j) #:width 2 #:align 'right))
" "))))
(draw (tour (random N) (random N)))
にだとそれは私に、このエラーfor: expected a sequence for n, got something else: #f
を与え、ハイライト私のコードのこのセクション:
(define (draw tour)
(define v (make-vector (* N N)))
(for ([n tour] [i (in-naturals 1)]) (vector-set! v n i))
(for ([i N])
(displayln (string-join (for/list ([j (in-range i (* N N) N)])
(~a (vector-ref v j) #:width 2 #:align 'right))
" "))))
をそして、私は問題が何であるかわかりません。これはクラスのためのもので、私はラケット言語に慣れていません。どんな助けもありがとう。おかげ
ランダムに生成されているため、最初の要素があるはずです。 Nを4より上の数字に変更すると、それはうまくいくが、3のために働く必要がある。 – butimnotarapper
@butimnotarapper私は自分の答えを更新した。あなたは3x3と4x4ボード上の任意の開始位置の解決策を見つけることができません。 – Sylwester