Problem:
Score : 300 points

Problem Statement

You are given a grid of squares with H horizontal rows and W vertical columns, where each square is painted white or black.
HW characters from A_{11} to A_{HW} represent the colors of the squares.
A_{ij} is # if the square at the i-th row from the top and the j-th column from the left is black, and A_{ij} is . if that square is white.

We will repeatedly perform the following operation until all the squares are black:

Every white square that shares a side with a black square, becomes black.

Find the number of operations that will be performed.
The initial grid has at least one black square.

Constraints

1 \leq H,W \leq 1000

A_{ij} is # or ..

The given grid has at least one black square.

Input

Input is given from Standard Input in the following format:

H W
A_{11}A_{12}...A_{1W}
:
A_{H1}A_{H2}...A_{HW}

Output

Print the number of operations that will be performed.

Sample Input 1

3 3
...
.#.
...

Sample Output 1

2

After one operation, all but the corners of the grid will be black. After one more operation, all the squares will be black.

Sample Input 2

6 6
..#..#
......
#..#..
......
.#....
....#.

Sample Output 2

3

Solution in PyPy3 (2.4.0) (judge verdict: Wrong Answer)

from collections import deque
import sys


H, W = [int(_) for _ in input().split()]

M = []
queues = []
for i in range(H):
    A = input()
    M.append(A)
    for j in range(W):
        if A[j] == '#':
            queues.append(deque([[j, i, 0]]))

visited = [[False for _ in range(W)] for _ in range(H)]

max_count = 0
while True:
    for q in queues:
        if len(q) == 0:
            continue
        p = q.popleft()
        x = p[0]
        y = p[1]
        count = p[2]
        max_count = max(max_count, count)
        cands = []
        if x - 1 >= 0:
            cands.append([x-1, y])
        if x + 1 < W:
            cands.append([x+1, y])
        if y - 1 >= 0:
            cands.append([x, y-1])
        if y + 1 < H:
            cands.append([x, y+1])
        for cx, cy in cands:
            if M[cy][cx] == '.' and not visited[cy][cx]:
                q.append([cx, cy, count+1])
                visited[cy][cx] = True
    queues = [q for q in queues if len(q) != 0]
    if len(queues) == 0:
        print(max_count)
        break