module mod_que
    type queue
        integer,pointer:: v(:)
        integer(4):: i=0, ii=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

        q%ii=q%ii+1
        ret = q%v(q%ii)
    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%i-x%ii > 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.

    !     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*, cnt
    ! 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