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 Julia (1.4.0) (judge verdict: Time Limit Exceeded)

function main()
  (H, W) = map(x -> parse(Int, x), split(readline()))
  c = []
  d = []
  for i = 1:H
    push!(c, split(chomp(readline()), ""))
    push!(d, fill(-1, W))
  end
  q = []
  for i = 1:H
    for j = 1:W
      if c[i][j] == "#"
        push!(q, [i, j])
        d[i][j] = 0
      end
    end
  end
  p = popfirst!(q)
  max = 0
  dx = [1, 0, -1, 0]
  dy = [0, 1, 0, -1]
  while true
    xx = p[1]
    yy = p[2]
    for i = 1:4
      x = xx + dx[i]
      y = yy + dy[i]
      if x > 0 && x < H + 1 && y > 0 && y < W + 1 && d[x][y] < 0
        if c[x][y] == "."
          push!(q, [x, y])
          count = d[xx][yy] + 1
          if max < count
            max = count
          end
          d[x][y] = count
        end
      end
    end
    if length(q) == 0
      break
    end
    p = popfirst!(q)
  end
  println(max)
end
main()