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

parseInt(x) = parse(Int,x)
findall(f,x) = find(f,x)
parseMap(x::Array{SubString{String}, 1}) = map(parseInt, x)
function main()
  h,w = map(parseInt, split(readline()))
  ss = [readline() for i in 1:h]
  sm = [zeros(w) for i in 1:h]
  for i = 1:h
    ii = findall(x-> x == '#',ss[i])
    if !isempty(ii)
      sm[i][ii] = 1
    end
  end
  a = [ones(w) for i in 1:h]
  ans = 0
  if h==1 && w==1
    if sm[1][1] == 1
      ans =0
    else
      ans =1
    end
  elseif h == 1
    while true
      if sm == a
        break
      else
        ans += 1
        temp = sm[1:end]
        temp[1][1:end-1] =temp[1][1:end-1]+ sm[1][1:end-1] + sm[1][2:end]
        temp[1][2:end] =temp[1][2:end]+ sm[1][2:end] + sm[1][1:end-1]
        ii = findall(x-> x>=2,temp[h]) 
        if !isempty(ii)
          temp[1][ii]  = 1
        end
        sm = temp
      end
    end
  elseif w == 1
    while true
      if sm == a
        break
      else
        ans += 1
        temp = sm[1:end]
        temp[1:end-1][1] =temp[1:end-1][1]+ sm[2:end][1] + sm[1:end-1][1]
        temp[2:end][1] =temp[2:end][1]+ sm[2:end][1] + sm[1:end-1][1]
        for i = 1:h
          ii = findall(x-> x>=2,temp[h]) 
          if !isempty(ii)
            temp[h][ii]  = 1
          end
      end
        sm = temp
      end
    end
  else
    while true
      if sm == a
        break
      else
        ans += 1
        temp = sm[1:end]
        temp[1][1:end-1] =temp[1][1:end-1]+ sm[1][1:end-1] + sm[1][2:end]
        temp[1][2:end] = temp[1][2:end]+sm[1][2:end] + sm[1][1:end-1]
        temp[2][1:end] = temp[2][1:end]+sm[2][1:end] + sm[1][1:end]
        for i = 2:h-1
          temp[i][1:end-1] = temp[i][1:end-1]+sm[i][1:end-1] + sm[i][2:end]
          temp[i][2:end] = temp[i][2:end] +sm[i][2:end] + sm[i][1:end-1]
          temp[i+1][1:end] = temp[i+1][1:end]+sm[i+1][1:end] + sm[i][1:end]
          temp[i-1][1:end] =temp[i-1][1:end]+ sm[i-1][1:end] + sm[i][1:end]
        end
        temp[end][1:end-1] = temp[end][1:end-1]+sm[end][1:end-1] + sm[end][2:end]
        temp[end][2:end] = temp[end][2:end]+sm[end][2:end] + sm[end][1:end-1]
        temp[end-1][1:end] = temp[end-1][1:end]+sm[end-1][1:end] + sm[end][1:end]
        if sm[1][1] >= 1
          temp[1][2] = temp[2][1] =1
        end
        if sm[1][w] >= 1
          temp[1][w-1] = temp[2][w] =1
        end
        if sm[h][1] >= 1
          temp[h][2] = temp[h-1][1] =1
        end
        if sm[h][w] >= 1
          temp[h][w-1] = temp[h-1][w] =1
        end      
      end
      for i = 1:h
        ii = findall(x-> x>=2,temp[h]) 
        if !isempty(ii)
          temp[i][ii]  = 1
        end
      end
      sm = temp
    end
  end
  println(Int64(ans))
end
main()