#include <iostream> #include <stdio.h> #include <queue> #include <string.h> using namespace std; int memo[3001][3001]; char line[3001][3001]; int dxs[8]={-1,-1,-1,0,0,1,1,1}; int dys[8]={-1,0,1,-1,1,-1,0,1}; int h,w; struct E{ int x,y; }; int f(int p,int d,int max){ int p1=p+d; if((0<=p1)&&(p1<max)){ return p1; } if(p1<0){ return 0; } return max-1; } std::queue<E> qu; int main() { // your code goes here scanf("%d %d",&h,&w); memset(memo,0,sizeof(memo)); for(int i=0;i<h;i++){ scanf("%s",line[i]); } for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ if((i==0)||(i==h-1)||(j==0)||(j==w-1)){ if(line[i][j]=='#'){ E e1; e1.x=j; e1.y=i; qu.push(e1); memo[i][j]=1; } }else if(line[i][j]=='#'){ for(int k=0;k<8;k++){ if(line[i+dys[k]][j+dxs[k]]=='.'){ E e1; e1.x=j; e1.y=i; qu.push(e1); memo[i][j]=1; break; } } } } } int ans=0; while(qu.empty()==false){ std::queue<E> next; while(qu.empty()==false){ E e1=qu.front(); qu.pop(); int x=e1.x; int y=e1.y; for(int i=0;i<8;i++) { int x1=f(x,dxs[i],w); int y1=f(y,dys[i],h); if((memo[y1][x1]==0)&&(line[y1][x1]=='#')){ memo[y1][x1]=memo[y][x]+1; E e2; e2.y=y1; e2.x=x1; next.push(e2); if(ans<memo[y1][x1]){ ans=memo[y1][x1]; } } } } while(next.empty()==false) { qu.push(next.front()); next.pop(); } } printf("%d\n",ans); return 0; }