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):: ret

        ret = q%v(1)
        q%i=q%i-1
        q%v(1:q%i) = q%v(2:q%i+1)
    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,h
            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)

        do dx=-1,1
            do dy=-1,1
                if (abs(dx) == abs(dy)) cycle
                if ((nx+dx < 1 .or. nx+dx > w) .or. (ny+dy < 1 .or. ny+dy > h)) cycle
                if (see(nx+dx,ny+dy))cycle
                cn(nx+dx,ny+dy) = cn(nx,ny)+1
                see(nx+dx,ny+dy) = .true.
                call que(x,nx+dx)
                call que(y,ny+dy)
            end do
        end do
        all_see = .true.
        do i=1,h
            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)
end program name