Advertisement
nullzero

Untitled

Mar 29th, 2019
655
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 1.39 KB | None | 0 0
  1. #lang racket
  2.  
  3. (define (solve N)
  4.   (define (pair r c) (+ c (* r N)))
  5.   (define N^2 (* N N))
  6.   (define config (make-vector N^2 #f))
  7.   (define (disconnected?)
  8.     (define visited (make-vector N^2 #f))
  9.     (define init-pos
  10.       (for*/or ([r (in-range N)]
  11.                 [c (in-range N)])
  12.         (and (vector-ref config (pair r c)) (cons r c))))
  13.     (cond
  14.       [init-pos
  15.        (let dfs ([r (car init-pos)] [c (cdr init-pos)])
  16.          (when (and (<= 0 r (sub1 N))
  17.                     (<= 0 c (sub1 N))
  18.                     (not (vector-ref visited (pair r c)))
  19.                     (vector-ref config (pair r c)))
  20.            (vector-set! visited (pair r c) #t)
  21.            (for* ([dy '(-1 0 1)] [dx '(-1 0 1)])
  22.              (dfs (+ r dy) (+ c dx)))))
  23.        (for*/or ([r (in-range N)]
  24.                  [c (in-range N)])
  25.          (and (not (vector-ref visited (pair r c)))
  26.               (vector-ref config (pair r c))))]
  27.       [else
  28.        ; trivial case (no leaves)
  29.        #f]))
  30.   (let fill-config ([r 0] [c 0])
  31.     (cond
  32.       [(= r N) (if (disconnected?) 0 1)]
  33.       [(= c N) (fill-config (add1 r) 0)]
  34.       [else (vector-set! config (pair r c) #f)
  35.             (define c1 (fill-config r (add1 c)))
  36.             (vector-set! config (pair r c) #t)
  37.             (define c2 (fill-config r (add1 c)))
  38.             (+ c1 c2)])))
  39.  
  40. (for ([i (in-range 20)])
  41.   (time (printf "~a: ~a\n" i (solve i))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement