結果
| 問題 |
No.157 2つの空洞
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-07-26 17:24:11 |
| 言語 | Haskell (9.10.1) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,043 bytes |
| コンパイル時間 | 9,392 ms |
| コンパイル使用メモリ | 208,084 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-01 03:20:21 |
| 合計ジャッジ時間 | 7,150 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 16 |
コンパイルメッセージ
Loaded package environment from /home/judge/.ghc/x86_64-linux-9.8.2/environments/default [1 of 2] Compiling Main ( Main.hs, Main.o ) [2 of 2] Linking a.out
ソースコード
import Control.Applicative ((<$>))
import Control.Monad (replicateM)
import Data.Vector.Unboxed (Vector, (!), (//))
import qualified Data.Vector.Unboxed as V
main :: IO ()
main = do
[w, h] <- map read <$> words <$> getLine
solve w h <$> (concat <$> replicateM h getLine) >>= print
solve :: Int -> Int -> String -> Int
solve w h ss = let imp = V.fromList ss
(mp, ixs1) = dfs [maybe (0,0) fmIx $ V.findIndex (=='.') imp] imp []
(_, ixs2) = dfs [maybe (0,0) fmIx $ V.findIndex (=='.') mp] mp []
in minPath ixs1 ixs2
where toIx (i, j) = i * w + j
fmIx ix = divMod ix w
dfs [] mp ixs = (mp, ixs)
dfs (p:ps) mp ixs | mp ! (toIx p) == '#' = dfs ps mp ixs
| otherwise = let (i, j) = p
in dfs ([(i+1,j),(i-1,j),(i,j+1),(i,j-1)] ++ ps) (mp // [(toIx p, '#')]) (p:ixs)
minPath xs ys = minimum $ do
(i,j) <- xs
(i',j') <- ys
return $ abs (i - i') + abs (j - j') - 1