#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e3 + 5;
char a[N][N];
int d[N][N], n, m;
int dx[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
struct point {int x, y;};
queue<point> q;
int main()
{
cin >> n >> m;
memset(d, 0x3f, sizeof d);
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
if(a[i][j] == '1')
{
q.push({i, j});
d[i][j] = 0;
}
}
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int x = t.x + dx[i][0], y = t.y + dx[i][1];
if(x < 0 || x >= n || y < 0 || y >= m) continue;
if(d[x][y] > d[t.x][t.y] + 1)
{
d[x][y] = d[t.x][t.y] + 1;
q.push({x, y});
}
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
cout << d[i][j] << ' ';
cout << endl;
}
return 0;
}