Problem:
Score : 300 points

Problem Statement

You are given a grid of squares with H horizontal rows and W vertical columns, where each square is painted white or black.
HW characters from A_{11} to A_{HW} represent the colors of the squares.
A_{ij} is # if the square at the i-th row from the top and the j-th column from the left is black, and A_{ij} is . if that square is white.

We will repeatedly perform the following operation until all the squares are black:

Every white square that shares a side with a black square, becomes black.

Find the number of operations that will be performed.
The initial grid has at least one black square.

Constraints

1 \leq H,W \leq 1000

A_{ij} is # or ..

The given grid has at least one black square.

Input

Input is given from Standard Input in the following format:

H W
A_{11}A_{12}...A_{1W}
:
A_{H1}A_{H2}...A_{HW}

Output

Print the number of operations that will be performed.

Sample Input 1

3 3
...
.#.
...

Sample Output 1

2

After one operation, all but the corners of the grid will be black. After one more operation, all the squares will be black.

Sample Input 2

6 6
..#..#
......
#..#..
......
.#....
....#.

Sample Output 2

3

Solution in Haskell (GHC 7.10.3) (judge verdict: Wrong Answer)

import qualified Data.Text as T
import qualified Data.Text.IO as T
import qualified Data.Text.Read as T
import qualified Data.Vector.Unboxed as V
import qualified Data.IntSet as S
import Data.Bool (bool)

main :: IO ()
main = do
  (h : w : _) <- map unsafeSignedDecimal . T.words <$> T.getLine :: IO [Int]
  let
    encode :: (Int, Int) -> Int
    encode (i, j) = i + h + j
    decode :: Int -> (Int, Int)
    decode n = divMod n h
    shiftU :: Int -> Maybe Int
    shiftU n = let {(i, j) = decode n; i' = pred i} in bool Nothing (Just . encode $ (i', j)) (i' >= 0)
    shiftD :: Int -> Maybe Int
    shiftD n = let {(i, j) = decode n; i' = succ i} in bool Nothing (Just . encode $ (i', j)) (i' < h)
    shiftL :: Int -> Maybe Int
    shiftL n = let {(i, j) = decode n; j' = pred j} in bool Nothing (Just . encode $ (i, j')) (j' >= 0)
    shiftR :: Int -> Maybe Int
    shiftR n = let {(i, j) = decode n; j' = succ j} in bool Nothing (Just . encode $ (i, j')) (j' < w)
    candidates :: Int -> [Int]
    candidates n = [shiftU n, shiftD n, shiftL n, shiftR n] >>= maybe [] pure
  as <- V.fromList . concat . map (T.foldr ((:) . (== '#')) []) . T.lines <$> T.getContents :: IO (V.Vector Bool)
  let
    bijs = filter (as V.!) $ [0..(pred (h * w))] :: [Int]
    n = search 0 bijs (S.fromAscList bijs) :: Int
    search :: Int -> [Int] -> S.IntSet -> Int
    search k targets blacks | null targets' = k
                            | otherwise = search (succ k) targets' blacks'
      where
        (targets', blacks') =  foldr step ([], blacks) . concat . map candidates $ targets
  print n

step :: Int -> ([Int], S.IntSet) -> ([Int], S.IntSet)
step t (ts, bs) = if S.member t bs then (ts, bs) else (t : ts, S.insert t bs)

unsafeSignedDecimal :: T.Text -> Int
unsafeSignedDecimal s = case T.signed T.decimal s of
  Right (n, _) -> n