#include using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define ALL(v) (v).begin(),(v).end() template inline bool chmax(A &a, B b) { if (a inline bool chmin(A &a, B b) { if (a>b) { a=b; return 1; } return 0; } typedef unsigned long long ull; typedef long long ll; typedef pair pii; typedef pair pll; typedef pair P; const ll INF = 1ll<<29; const ll MOD = 1000000007; const double EPS = 1e-10; int h, w; string maps[3000]; int d[3000][3000]; struct Data { int d, y, x, sy, sx; bool operator > (const Data &r) const { if (d != r.d) return d > r.d; if (y != r.y) return y > r.y; if (x != r.x) return x > r.x; if (sy != r.sy) return sy > r.sy; return sx > r.sx; } }; int main() { cin >> h >> w; REP(i, h) cin >> maps[i]; fill(d[0], d[h], INF); priority_queue, greater > pq; REP(i, h) { pq.push( (Data){ 1, i, 0, i, -1 } ); pq.push( (Data){ 1, i, w - 1, i, w } ); } REP(j, w) { pq.push( (Data){ 1, 0, j, -1, j } ); pq.push( (Data){ 1, h - 1, j, h, j } ); } REP(i, h) REP(j, w) if (maps[i][j] == '.') pq.push( (Data){ 0, i, j, i, j } ); while (!pq.empty()) { Data now = pq.top(); pq.pop(); if (!chmin(d[now.y][now.x], now.d)) continue; int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1}; REP(i, 4) { int nx = now.x + dx[i]; int ny = now.y + dy[i]; if (!(nx >= 0 && nx < w && ny >= 0 && ny < h)) continue; int nd = max(abs(nx - now.sx), abs(ny - now.sy)); if (d[ny][nx] <= nd) continue; pq.push( (Data){ nd, ny, nx, now.sy, now.sx} ); } } int ans = 0; REP(i, h) REP(j, w) chmax(ans, d[i][j]); cout << ans << endl; return 0; }