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: Time Limit Exceeded)

module mod_que
    type queue
        integer,pointer:: v(:)
        integer(4):: i=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%i=q%i+1
        if (q%i > size(q%v)) call add(q)
        q%v(q%i) = 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),pointer:: t(:)
        integer(4):: ret,l
        ret = q%v(1)
        q%i=q%i-1
        l = q%i
        allocate(t(l))
        t(:) = q%v(2:l+1)
        q%v(:l) = t(:)
        deallocate(t)
    end function
end module mod_que

program name
    use mod_que
    implicit none
    integer(4):: h,w,i,j,nx,ny,dx,dy
    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(w,h), cn(w,h), see(w,h))
    allocate(character(w):: aa)

    cn(:,:) = -1    
    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)
            end if
        end do
    end do

    do while(x%i > 0)
        nx = deque(x)
        ny = deque(y)
        see(nx,ny) = .true.
        ! print*, nx,ny
        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.
        do i=1,h
            ! print*, see(:,i)
            do j=1,w
                if (.not. see(j,i)) all_see = .false.
            end do
        end do
        if (all_see) exit
    end do

    print*, maxval(cn)

    contains
    subroutine next(ix,iy, ox,oy)
        integer(4):: ix,iy,ox,oy

        ! print*, 1<=ix, ix<=w, 1<=iy, iy<=h, ix, iy
        if (.not. (1<=ix .and. ix<=w .and. 1<=iy .and. iy<=h)) return
        if (see(ix,iy)) return
        call que(x,ix)
        call que(y,iy)
        cn(ix,iy) = cn(ox,oy)+1
    end subroutine
end program name