7576

#include <bits/stdc++.h>
using namespace std;
struct tomato
{
    int y, x;
};
 
//상 하 좌 우
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
 
int m, n;
int box[1001][1001];
queue<tomato> q;
 
//상자 범위 안에 있는지 체크
bool is_inside(int ny, int nx)
{
    return (0 <= ny && ny < n && 0 <= nx && nx < m);
}
 
//너비우선탐색
void bfs(void)
{
    
    while(!q.empty())
    {
        //큐에서 현재 토마토의 좌표 꺼내오기
        int y = q.front().y;
        int x = q.front().x;
        q.pop();
 
        for(int i=0; i<4; i++)
        {
            //인접 토마토의 좌표 계산
            int ny = y + dy[i];
            int nx = x + dx[i];
            //상자 범위를 벗어나지 않고 안 익었다면
            if(is_inside(ny, nx) == 1 && box[ny][nx] == 0)
            {
                box[ny][nx] = box[y][x] + 1; //익은 날짜 저장
                q.push({ ny, nx });//큐에추가
            }
        }
    }
}
 
int main()
{
 
    cin >> m >> n;
 
    //상자 입력
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            cin >> box[i][j];
            if(box[i][j] == 1) q.push({i, j});//익은 토마토는 큐에 추가
        }
    }
 
    bfs();
 
    int max = 0;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            //안 익은 토마토가 존재할 경우
            if(box[i][j] == 0) 
            {
                cout << -1 << "\n";
                return 0;
            }
            //최댓값 계산
            if(max < box[i][j]) max = box[i][j];
        }
    }
 
    //최댓값-1 출력
    cout << max-1 << "\n";
 
    return 0;
}