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 Fortran (gfortran v4.8.4) (judge verdict: Accepted)

module mod_que
    type queue
        integer,pointer:: v(:)
        integer(4):: lst=0, fst=0
    end type
contains
    subroutine que_init(q)
        type(queue):: q

        allocate(q%v(1))
    end subroutine

    subroutine que(q,num)
        type(queue):: q
        integer(4):: num

        q%lst=q%lst+1
        if (q%lst > size(q%v)) call add(q)
        q%v(q%lst) = num
    end subroutine

    subroutine add(q)
        type(queue):: q
        integer(4),pointer:: tmp(:)
        integer(4):: l

        l = size(q%v)
        allocate(tmp(l))
        tmp(1:l) = q%v(1:l)
        deallocate(q%v)
        allocate(q%v(2*l))
        q%v(1:l) = tmp(1:l)
        deallocate(tmp)
    end subroutine

    function deque(q) result(ret)
        type(queue):: q
        integer(4):: ret
        q%fst=q%fst+1
        ret = q%v(q%fst)
    end function
end module mod_que

program name
    use mod_que
    implicit none
    integer(4):: h,w,i,j,nx,ny,cnt
    character(1),allocatable:: a(:,:)
    character(:),allocatable:: aa
    integer(4),allocatable:: cn(:,:)
    logical,allocatable:: see(:,:)
    logical:: all_see
    type(queue):: x,y

    call que_init(x)
    call que_init(y)
    read*, h,w
    allocate(a(0:w+1,0:h+1), cn(0:w+1,0:h+1), see(0:w+1,0:h+1))
    allocate(character(w):: aa)

    cn(:,:) = -2
    see(:,:) = .false.

    do i=1,h
        read*, aa(:)
        do j=1,w
            a(j,i) = aa(j:j)
            if (a(j,i) == '#') then
                cn(j,i) = 0
                see(j,i) = .true.
                call que(x,j)
                call que(y,i)
            else
                cn(j,i) = -1
            end if
        end do
    end do

    cnt=0
    do while(x%lst-x%fst > 0)
        cnt=cnt+1
        nx = deque(x)
        ny = deque(y)
        call next(nx+1,ny, nx,ny)
        call next(nx-1,ny, nx,ny)
        call next(nx,ny-1, nx,ny)
        call next(nx,ny+1, nx,ny)
        all_see = .true.
    end do

    print*, maxval(cn)
contains
    subroutine next(ix,iy, ox,oy)
        integer(4):: ix,iy,ox,oy
        if (cn(ix,iy) /= -1) return
        call que(x,ix)
        call que(y,iy)
        cn(ix,iy) = cn(ox,oy)+1
        see(ix,iy) = .true.
    end subroutine
end program name