Buggy python submission (verdict: Time Limit Exceeded):
import collections
import sys

#入力
H, W = map(int, input().split())

lst = []
for i in range(H):
    lst += [list(input())]

count = 0
INF = 10 ** 9
q =collections.deque() #動作用のqueue
dp = [[INF] * W for _ in range(H)] #そのマスを確認したかのフラグ
#print (dp)

move = [[-1, 0], [1, 0], [0, -1], [0, 1]]

def check(): #確認の起点になっていない黒マスを全てqueueに入れる
    for i in range(H):
        for j in range(W):
#            print ('i, j, count =', i, j, count)
            if lst[i][j] == '#': #黒マスであることの確認
               if  dp[i][j] == INF:#dp[i][j]がINF= 初回黒のところ
                   q.append([i, j])
#                   print ('INF')
                   dp[i][j] = 0 #フラグを0-->0回で変えることができる
               elif dp[i][j] == count: #dp[i][j] == count-->count回目で黒に変わったもの
#                   print ('dp[i][j]= ', dp[i][j])
                   q.append([i, j])
#                   print (q)
#                   print ('A')
    return

def change(px, py): #現在座標(px,py)から上下左右のマスを白に変え、手数を記録する
    for dx, dy in move:
        nx = px + dx
        ny = py + dy
        if 0 <= nx and nx < H and 0 <= ny and ny < W: #移動先が範囲内であることの確認
            dp[nx][ny] = min(dp[px][py] +1, dp[nx][ny]) #すでに入っている値と新しい値の小さい方を記録し直す
            lst[nx][ny] = '#' #移動先を黒色に変える


while True:
    check() #未確認の黒マスをdequeに入れる
#    print (q)
    if not q: #dequが空の時
        print (count-1) #現在までに変えた回数 = count を入れて終わる
        sys.exit()
    else: #dequeが空でない= 未確認の黒マスがある
       while q: #dequeが空になるまで回す
           px, py = q.popleft()
           change(px, py)
       count += 1
#       print (count, '回変えた後',dp)


Fixed submission:
import numpy as np

H, W = map(int, input().split())
max_value = H + W #左上から右下までの最大手数
matrix = []

#黒の場合0, それ以外の場合、max_valueを代入したリストを作成-->arrayへ変換
for _ in range(H):
    matrix.append([0 if i == '#' else max_value for i in list(input())])
matrix = np.array(matrix)

for c in range(W-1):#y座標を増やしていく
    matrix[:,c+1] = np.minimum(matrix[:,c]+1, matrix[:,c+1]) #一個左+1　と　自分自身の値　の小さい方
#print (matrix)
for c in range(W-1,0,-1):
    matrix[:,c-1] = np.minimum(matrix[:,c]+1, matrix[:,c-1]) #一個右+1　と　自分自身の値　の小さい方
#print (matrix)
for c in range(H-1):
    matrix[c+1,:] = np.minimum(matrix[c,:]+1, matrix[c+1,:]) #一個下+1　と　自分自身の値　の小さい方　
#print (matrix)
for c in range(H-1,0,-1):
    matrix[c-1,:] = np.minimum(matrix[c,:]+1, matrix[c-1,:]) #一個上+1　と　自分自身の値　の小さい方
#print (matrix)
print (np.max(matrix))

Buggy python submission (verdict: Runtime Error):
#入力
H, W = map(int, input().split())

lst = []
for i in range(H):
    lst += [list(input())]

#print (lst)
INF = 10 ** 9
dp =[[INF] * W for _ in range(H)]

def bfs1(i, j): #右下向き
#    print ('i, j= ', i, j)
    if i < 0 or i == W or j < 0 or j == H:
        return INF
    elif lst[i][j] == '#':
        dp[i][j] = 0
        return 0
    else:
        a = min(bfs1(i+1, j)+1, bfs1(i, j+1)+1)
        dp[i][j] = a
        return a

def bfs2(i, j): #左上向き
#    print ('i, j= ', i, j)
    if i < 0 or i == W or j < 0 or j == H:
        return INF
    elif lst[i][j] == '#':
        return 0
    else:
        b = min(bfs2(i-1, j)+1, bfs2(i, j-1)+1, dp[i][j])
        dp[i][j] = b
        return b


ans1 = INF
ans2 = INF
for x in range(W):
    for y in range(H):
        bfs1(x,y)

for v in range(W):
    for w in range(H):
        bfs2(W-1-v, H-1-w)

c = 0
for a in range(W):
    b = max(dp[a])
    c =max(b, c)
print (c)
#print (ans1)
#print (ans2)

#print ('ans= ', min(ans1, ans2))
#print (min(ans1, ans2))

Fixed submission:
import numpy as np

H, W = map(int, input().split())
max_value = H + W #左上から右下までの最大手数
matrix = []

#黒の場合0, それ以外の場合、max_valueを代入したリストを作成-->arrayへ変換
for _ in range(H):
    matrix.append([0 if i == '#' else max_value for i in list(input())])
matrix = np.array(matrix)

for c in range(W-1):#y座標を増やしていく
    matrix[:,c+1] = np.minimum(matrix[:,c]+1, matrix[:,c+1]) #一個左+1　と　自分自身の値　の小さい方
#print (matrix)
for c in range(W-1,0,-1):
    matrix[:,c-1] = np.minimum(matrix[:,c]+1, matrix[:,c-1]) #一個右+1　と　自分自身の値　の小さい方
#print (matrix)
for c in range(H-1):
    matrix[c+1,:] = np.minimum(matrix[c,:]+1, matrix[c+1,:]) #一個下+1　と　自分自身の値　の小さい方　
#print (matrix)
for c in range(H-1,0,-1):
    matrix[c-1,:] = np.minimum(matrix[c,:]+1, matrix[c-1,:]) #一個上+1　と　自分自身の値　の小さい方
#print (matrix)
print (np.max(matrix))

Buggy python submission (verdict: Runtime Error):
#入力
H, W = map(int, input().split())

lst = []
for i in range(H):
    lst += [list(input())]

#print (lst)
INF = 10 ** 9
#dp =[[INF] * W for _ in range(H)]

def bfs1(i, j): #右下向き
#    print ('i, j= ', i, j)
    if i < 0 or i == W or j < 0 or j == H:
        return 0
    elif lst[i][j] == '#':
        return 0
    else:
        return min(bfs1(i+1, j)+1, bfs1(i, j+1)+1)

def bfs2(i, j): #左上向き
#    print ('i, j= ', i, j)
    if i < 0 or i == W or j < 0 or j == H:
        return 0
    elif lst[i][j] == '#':
        return 0
    else:
        return min(bfs2(i-1, j)+1, bfs2(i, j-1)+1)


ans1 = 0
ans2 = 0
for x in range(W):
    for y in range(H):
        ans1 = max(ans1, bfs1(x,y))
#        print (ans1)
        ans2 = max(ans2, bfs2(W-1-x, H-1-y))

#print (ans1)
#print (ans2)

#print ('ans= ', min(ans1, ans2))
print (min(ans1, ans2))

Fixed submission:
import numpy as np

H, W = map(int, input().split())
max_value = H + W #左上から右下までの最大手数
matrix = []

#黒の場合0, それ以外の場合、max_valueを代入したリストを作成-->arrayへ変換
for _ in range(H):
    matrix.append([0 if i == '#' else max_value for i in list(input())])
matrix = np.array(matrix)

for c in range(W-1):#y座標を増やしていく
    matrix[:,c+1] = np.minimum(matrix[:,c]+1, matrix[:,c+1]) #一個左+1　と　自分自身の値　の小さい方
#print (matrix)
for c in range(W-1,0,-1):
    matrix[:,c-1] = np.minimum(matrix[:,c]+1, matrix[:,c-1]) #一個右+1　と　自分自身の値　の小さい方
#print (matrix)
for c in range(H-1):
    matrix[c+1,:] = np.minimum(matrix[c,:]+1, matrix[c+1,:]) #一個下+1　と　自分自身の値　の小さい方　
#print (matrix)
for c in range(H-1,0,-1):
    matrix[c-1,:] = np.minimum(matrix[c,:]+1, matrix[c-1,:]) #一個上+1　と　自分自身の値　の小さい方
#print (matrix)
print (np.max(matrix))