提出 #16152946
ソースコード 拡げる
{-# LANGUAGE BangPatterns #-}
import Control.Exception (assert)
import Control.Monad
import Control.Monad.Primitive
import qualified Control.Monad.ST as ST
import qualified Data.Array.IO as IO
import qualified Data.Array.ST as ST
import qualified Data.Array.Unboxed as A
import Data.Bits
import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.Foldable
import Data.List
import qualified Data.Map.Strict as Map
import Data.Maybe
import qualified Data.Sequence as Seq
import qualified Data.Set as Set
import qualified Data.Vector as VB
import qualified Data.Vector.Mutable as VBM
import qualified Data.Vector.Unboxed as V
import qualified Data.Vector.Unboxed.Mutable as VM
import Debug.Trace
readInt = fst . fromJust . BS.readInt
readIntList = map readInt . BS.words
getInt = readInt <$> BS.getLine
getIntList = readIntList <$> BS.getLine
getIntVec n = V.unfoldrN n (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine
readInteger = fst . fromJust . BS.readInteger
readIntegerList = map readInteger . BS.words
getInteger = readInteger <$> BS.getLine
getIntegerList = readIntegerList <$> BS.getLine
inf :: Int
inf = 10^18
main = do
[h, w] <- getIntList
[ch, cw] <- getIntList
[dh, dw] <- getIntList
s <- replicateM h $ BS.getLine
let s' = VB.fromList s
arr <- IO.newArray ((1,1),(h,w)) inf :: IO (IO.IOUArray (Int,Int) Int)
let getC y x | y < 1 || y > h || x < 1 || x > w = '#'
| otherwise = (s' VB.! (y-1)) `BS.index` (x-1)
let bfs :: Seq.Seq (Int, Int, Int) -> IO ()
bfs q
| Seq.null q = return ()
| otherwise = do
let (ct,y,x) Seq.:< q' = Seq.viewl q
c = getC y x
if c == '#'
then bfs q'
else do v <- IO.readArray arr (y, x)
if v <= ct
then bfs q'
else do IO.writeArray arr (y, x) ct
if (y == dh && x == dw)
then bfs q'
else do
let walkable = [(ct, y',x') |
(y',x') <- [(y-1, x),(y+1, x), (y, x-1), (y, x+1)],
getC y' x' /= '#']
warpable = [(ct+1, y+dy,x+dx) |
dy <- [(-2)..2], dx <- [(-2)..2],
getC (y+dy) (x+dx) /= '#']
q1 = (Seq.fromList walkable) Seq.>< q'
q2 = q1 Seq.>< (Seq.fromList warpable)
bfs $ q2
bfs $ Seq.fromList [(0,ch,cw)]
ans <- IO.readArray arr (dh, dw)
print $ if ans >= inf then (-1) else ans
提出情報
コンパイルエラー
Loaded package environment from /home/contestant/.ghc/x86_64-linux-8.8.3/environments/default
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
400 / 400 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
| All |
hand_01.txt, hand_02.txt, max_01.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_11.txt, random_12.txt, sample_01.txt, sample_02.txt, sample_03.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| hand_01.txt |
AC |
10 ms |
4352 KiB |
| hand_02.txt |
AC |
2 ms |
4188 KiB |
| max_01.txt |
AC |
85 ms |
14628 KiB |
| random_01.txt |
AC |
26 ms |
14104 KiB |
| random_02.txt |
AC |
41 ms |
6292 KiB |
| random_03.txt |
AC |
327 ms |
26200 KiB |
| random_04.txt |
AC |
174 ms |
11372 KiB |
| random_05.txt |
AC |
1630 ms |
56036 KiB |
| random_06.txt |
AC |
509 ms |
24952 KiB |
| random_11.txt |
AC |
8 ms |
5460 KiB |
| random_12.txt |
AC |
3 ms |
4892 KiB |
| sample_01.txt |
AC |
2 ms |
4328 KiB |
| sample_02.txt |
AC |
2 ms |
4008 KiB |
| sample_03.txt |
AC |
3 ms |
4392 KiB |