提出 #4572433


ソースコード 拡げる

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defparameter OPT
    #+swank '(optimize (speed 3) (safety 2))
    #-swank '(optimize (speed 3) (safety 0) (debug 0)))
  #+swank (progn (ql:quickload '(:cl-debug-print :fiveam))
                 (shadow :run)
                 (use-package :fiveam)))
#+swank (cl-syntax:use-syntax cl-debug-print:debug-print-syntax)

;; BEGIN_INSERTED_CONTENTS
(defmacro buffered-read-line (&optional (buffer-size 30) (in '*standard-input*) (terminate-char #\Space))
  "Note that the returned string will be reused."
  (let ((buffer (gensym))
        (character (gensym))
        (idx (gensym)))
    `(let ((,buffer (load-time-value (make-string ,buffer-size
                                                  :element-type 'base-char))))
       (declare (simple-base-string ,buffer)
                (inline read-byte))
       (loop for ,character of-type base-char =
                #-swank (code-char (read-byte ,in nil #.(char-code #\Newline)))
                #+swank (read-char ,in nil #\Newline)
             for ,idx from 0
             until (char= ,character #\Newline)
             do (setf (schar ,buffer ,idx) ,character)
             finally (when (< ,idx ,buffer-size)
                       (setf (schar ,buffer ,idx) ,terminate-char))
                     (return (values ,buffer ,idx))))))

(defstruct (queue (:constructor make-queue
                    (&optional list &aux (tail (last list)))))
  (list nil :type list)
  (tail nil :type (or null (cons t null))))

(declaim (inline enqueue))
(defun enqueue (obj queue)
  (symbol-macrolet ((list (queue-list queue))
                    (tail (queue-tail queue)))
    (if (null list)
        (setf tail (list obj)
              list tail)
        (setf (cdr tail) (list obj)
              tail (cdr tail))))
  queue)

(declaim (inline dequeue))
(defun dequeue (queue)
  (pop (queue-list queue)))

(declaim (inline enqueue-front))
(defun enqueue-front (obj queue)
  (symbol-macrolet ((list (queue-list queue))
                    (tail (queue-tail queue)))
    (if (null list)
        (setf tail (list obj)
              list tail)
        (push obj list))
    queue))

(defmacro define-int-types (&rest bits)
  `(progn
     ,@(mapcar (lambda (b) `(deftype ,(intern (format nil "UINT~A" b)) () '(unsigned-byte ,b))) bits)
     ,@(mapcar (lambda (b) `(deftype ,(intern (format nil "INT~A" b)) () '(signed-byte ,b))) bits)))
(define-int-types 4 7 8 15 16 31 32 62 63 64)

(defmacro println (obj &optional (stream '*standard-output*))
  `(let ((*read-default-float-format* 'double-float))
     (prog1 (princ ,obj ,stream) (terpri ,stream))))

;; Hauptteil
(defun reachable-p (plan start-i start-j)
  "0-1 BFS"
  (declare #.OPT
           ((simple-array base-char (* *)) plan))
  (let* ((height (array-dimension plan 0))
         (width (array-dimension plan 1))
         (height-1 (- height 1))
         (width-1 (- width 1))
         (queue (make-queue))
         (marked (make-array (list height width) :element-type 'bit :initial-element 0)))
    (declare (uint16 height width))
    (labels ((frob-neighbor (dist i j)
               (declare (uint32 dist))
               (case (aref plan i j)
                 (#\#
                  (enqueue (list (1+ dist) i j) queue)
                  (setf (aref marked i j) 1))
                 (#\.
                  (enqueue-front (list dist i j) queue)
                  (setf (aref marked i j) 1))
                 (#\g (return-from reachable-p t)))))
      (declare (inline frob-neighbor))
      (enqueue (list 0 start-i start-j) queue)
      (setf (aref marked start-i start-j) 1)
      (loop for vertex = (dequeue queue)
            until (null vertex)
            for (dist i j) of-type (uint4 uint16 uint16) = vertex
            when (<= dist 2)
            do (when (and (< 0 i) (zerop (aref marked (- i 1) j)))
                 (frob-neighbor dist (- i 1) j))
               (when (and (< i height-1) (zerop (aref marked (+ i 1) j)))
                 (frob-neighbor dist (+ i 1) j))
               (when (and (< 0 j) (zerop (aref marked i (- j 1))))
                 (frob-neighbor dist i (- j 1)))
               (when (and (< j width-1) (zerop (aref marked i (+ j 1))))
                 (frob-neighbor dist i (+ j 1)))
            finally (return nil)))))

(defun main ()
  (declare #.OPT)
  (let* ((height (read))
         (width (read))
         (stadtplan (make-array (list height width) :element-type 'base-char))
         start-i start-j)
    (dotimes (i height)
      (let ((row (buffered-read-line 500)))
        (dotimes (j width)
          (when (char= #\s (aref row j))
            (setf start-i i start-j j))
          (setf (aref stadtplan i j) (aref row j)))))
    (write-line (if (reachable-p stadtplan start-i start-j)
                    "YES" "NO"))))

#-swank(main)

提出情報

提出日時
問題 C - 器物損壊!高橋君
ユーザ sansaqua
言語 Common Lisp (SBCL 1.1.14)
得点 100
コード長 4963 Byte
結果 AC
実行時間 113 ms
メモリ 35432 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 83
セット名 テストケース
All 00_min_01.txt, 00_min_02.txt, 00_min_03.txt, 00_min_04.txt, 00_min_05.txt, 00_min_06.txt, 00_min_07.txt, 00_min_08.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 00_sample_04.txt, 00_sample_05.txt, 01_rnd_00.txt, 01_rnd_01.txt, 01_rnd_02.txt, 01_rnd_03.txt, 01_rnd_04.txt, 01_rnd_05.txt, 01_rnd_06.txt, 01_rnd_07.txt, 01_rnd_08.txt, 01_rnd_09.txt, 01_rnd_10.txt, 01_rnd_11.txt, 01_rnd_12.txt, 01_rnd_13.txt, 01_rnd_14.txt, 01_rnd_15.txt, 01_rnd_16.txt, 01_rnd_17.txt, 01_rnd_18.txt, 01_rnd_19.txt, 02_rndhard_00.txt, 02_rndhard_01.txt, 02_rndhard_02.txt, 02_rndhard_03.txt, 02_rndhard_04.txt, 02_rndhard_05.txt, 02_rndhard_06.txt, 02_rndhard_07.txt, 02_rndhard_08.txt, 02_rndhard_09.txt, 02_rndhard_10.txt, 02_rndhard_11.txt, 02_rndhard_12.txt, 02_rndhard_13.txt, 02_rndhard_14.txt, 02_rndhard_15.txt, 02_rndhard_16.txt, 02_rndhard_17.txt, 02_rndhard_18.txt, 02_rndhard_19.txt, 02_rndhard_20.txt, 02_rndhard_21.txt, 02_rndhard_22.txt, 02_rndhard_23.txt, 02_rndhard_24.txt, 02_rndhard_25.txt, 02_rndhard_26.txt, 02_rndhard_27.txt, 02_rndhard_28.txt, 02_rndhard_29.txt, 02_rndhard_30.txt, 02_rndhard_31.txt, 02_rndhard_32.txt, 02_rndhard_33.txt, 02_rndhard_34.txt, 02_rndhard_35.txt, 02_rndhard_36.txt, 02_rndhard_37.txt, 02_rndhard_38.txt, 02_rndhard_39.txt, 03_rndhardsmall_00.txt, 03_rndhardsmall_01.txt, 03_rndhardsmall_02.txt, 03_rndhardsmall_03.txt, 03_rndhardsmall_04.txt, 03_rndhardsmall_05.txt, 03_rndhardsmall_06.txt, 03_rndhardsmall_07.txt, 03_rndhardsmall_08.txt, 03_rndhardsmall_09.txt
ケース名 結果 実行時間 メモリ
00_min_01.txt AC 97 ms 19040 KiB
00_min_02.txt AC 97 ms 19048 KiB
00_min_03.txt AC 96 ms 19044 KiB
00_min_04.txt AC 97 ms 19044 KiB
00_min_05.txt AC 97 ms 19044 KiB
00_min_06.txt AC 97 ms 19044 KiB
00_min_07.txt AC 97 ms 19040 KiB
00_min_08.txt AC 97 ms 19044 KiB
00_sample_01.txt AC 97 ms 19044 KiB
00_sample_02.txt AC 97 ms 19048 KiB
00_sample_03.txt AC 97 ms 19044 KiB
00_sample_04.txt AC 97 ms 19048 KiB
00_sample_05.txt AC 97 ms 19048 KiB
01_rnd_00.txt AC 103 ms 19040 KiB
01_rnd_01.txt AC 112 ms 35432 KiB
01_rnd_02.txt AC 107 ms 25184 KiB
01_rnd_03.txt AC 104 ms 21092 KiB
01_rnd_04.txt AC 109 ms 31336 KiB
01_rnd_05.txt AC 103 ms 19044 KiB
01_rnd_06.txt AC 105 ms 21092 KiB
01_rnd_07.txt AC 112 ms 33380 KiB
01_rnd_08.txt AC 103 ms 19044 KiB
01_rnd_09.txt AC 103 ms 19044 KiB
01_rnd_10.txt AC 113 ms 33376 KiB
01_rnd_11.txt AC 103 ms 19044 KiB
01_rnd_12.txt AC 106 ms 25188 KiB
01_rnd_13.txt AC 108 ms 29284 KiB
01_rnd_14.txt AC 106 ms 23140 KiB
01_rnd_15.txt AC 106 ms 23136 KiB
01_rnd_16.txt AC 104 ms 19044 KiB
01_rnd_17.txt AC 113 ms 33380 KiB
01_rnd_18.txt AC 103 ms 19044 KiB
01_rnd_19.txt AC 109 ms 31332 KiB
02_rndhard_00.txt AC 105 ms 21092 KiB
02_rndhard_01.txt AC 105 ms 21088 KiB
02_rndhard_02.txt AC 110 ms 29280 KiB
02_rndhard_03.txt AC 111 ms 29280 KiB
02_rndhard_04.txt AC 108 ms 27236 KiB
02_rndhard_05.txt AC 110 ms 29280 KiB
02_rndhard_06.txt AC 108 ms 25188 KiB
02_rndhard_07.txt AC 106 ms 23136 KiB
02_rndhard_08.txt AC 106 ms 23136 KiB
02_rndhard_09.txt AC 106 ms 23140 KiB
02_rndhard_10.txt AC 106 ms 23140 KiB
02_rndhard_11.txt AC 106 ms 23140 KiB
02_rndhard_12.txt AC 105 ms 21088 KiB
02_rndhard_13.txt AC 105 ms 21088 KiB
02_rndhard_14.txt AC 106 ms 23140 KiB
02_rndhard_15.txt AC 109 ms 23136 KiB
02_rndhard_16.txt AC 112 ms 31332 KiB
02_rndhard_17.txt AC 110 ms 27240 KiB
02_rndhard_18.txt AC 106 ms 23140 KiB
02_rndhard_19.txt AC 105 ms 21092 KiB
02_rndhard_20.txt AC 106 ms 23144 KiB
02_rndhard_21.txt AC 106 ms 23140 KiB
02_rndhard_22.txt AC 106 ms 23136 KiB
02_rndhard_23.txt AC 106 ms 23144 KiB
02_rndhard_24.txt AC 108 ms 27236 KiB
02_rndhard_25.txt AC 108 ms 25184 KiB
02_rndhard_26.txt AC 107 ms 23136 KiB
02_rndhard_27.txt AC 105 ms 21088 KiB
02_rndhard_28.txt AC 104 ms 21096 KiB
02_rndhard_29.txt AC 104 ms 21088 KiB
02_rndhard_30.txt AC 103 ms 19044 KiB
02_rndhard_31.txt AC 106 ms 19040 KiB
02_rndhard_32.txt AC 109 ms 27240 KiB
02_rndhard_33.txt AC 107 ms 25188 KiB
02_rndhard_34.txt AC 107 ms 25188 KiB
02_rndhard_35.txt AC 108 ms 25188 KiB
02_rndhard_36.txt AC 106 ms 23144 KiB
02_rndhard_37.txt AC 106 ms 23136 KiB
02_rndhard_38.txt AC 106 ms 23140 KiB
02_rndhard_39.txt AC 107 ms 23140 KiB
03_rndhardsmall_00.txt AC 97 ms 19044 KiB
03_rndhardsmall_01.txt AC 97 ms 19044 KiB
03_rndhardsmall_02.txt AC 98 ms 19040 KiB
03_rndhardsmall_03.txt AC 97 ms 19048 KiB
03_rndhardsmall_04.txt AC 97 ms 19044 KiB
03_rndhardsmall_05.txt AC 97 ms 19044 KiB
03_rndhardsmall_06.txt AC 97 ms 19044 KiB
03_rndhardsmall_07.txt AC 97 ms 19044 KiB
03_rndhardsmall_08.txt AC 97 ms 19044 KiB
03_rndhardsmall_09.txt AC 98 ms 19044 KiB