#include #include #include #include //#include #include #include #include #include #include //#include #include #include #include //#include #include //#include #include #include #include #include #include const int dx[] = {1, 1, 0, -1, -1, -1, 0, 1}; const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1}; using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector vi; typedef vector vll; typedef pair pii; const int MAXH = 3333; const int INF = 1e9; string board[MAXH]; int d[MAXH][MAXH]; int main() { cin.tie(0); ios::sync_with_stdio(false); int H, W; cin >> H >> W; for (int i = 1; i <= H; i++) { string s; cin >> s; s = '.' + s + '.'; board[i] = s; } H += 2; W += 2; { string s; for (int i = 0; i < W; i++) s += '.'; board[0] = s; board[H-1] = s; } for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) d[i][j] = INF; queue que; for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { if (board[i][j] == '.') { d[i][j] = 0; que.push(pii(i, j)); } } while (!que.empty()) { auto p = que.front(); que.pop(); int y = p.first, x = p.second; for (int i = 0; i < 8; i++) { int ny = y+dy[i], nx = x+dx[i]; if (ny < 0 || ny >= H || nx < 0 || nx >= W) continue; if (d[ny][nx] > d[y][x] + 1) { d[ny][nx] = d[y][x] + 1; que.push(pii(ny, nx)); } } } int ans = 0; for (int i = 0; i < H; i++) for (int j = 0; j < W; j++) { ans = max(ans, d[i][j]); } cout << ans << endl; return 0; }