1), (-1, 0), (1, 0)] :: [(Int, Int)] main = do [h, w] <- getInts grid <- getCharGrid ((1, 1), (h, w)) let start = fromJust $ findArrayIndex (== 'S') grid goal = fromJust $ findArrayIndex (== 'G') grid let dist = bfs f (+) (-1) (((1, 1), False), ((h, w), True)) [((start, True), 0)] where f (v, flag) = [ ((u, flag'), 1) | d <- lrud, let u = v + d, inRange (bounds grid) u, if flag then grid ! u `elem` ['S', '.', 'o', 'G', '?'] else grid ! u `elem` ['S', '.', 'x', 'G', '?'], let flag' = if grid ! u == '?' then not flag else flag ] -- (省略) --