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)
        print*, nx,ny
        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
            print*, cn(:,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)
end program name