#include <bits/stdc++.h>
using namespace std;
void BFS(int h, int w, int sx, int sy, vector<vector<int>> &d, vector<string> &s) {
// x,yの上下左右移動を配列で持つ
int vx[4] = {0, 1, 0, -1};
int vy[4] = {1, 0, -1, 0};
// スタート地点はスタート地点から距離0で到達可能
d[sy][sx] = 0;
// queueで訪問するべきマスを持つ
queue<pair<int, int>> q;
// 最初はスタート地点をqueueにqush
q.push(make_pair(sx, sy));
// queueが空になるまで(訪問するべきマスが無くなるまで)
while (!q.empty()) {
// queueの先頭が現在のマス
pair<int, int> n = q.front();
// 現在のマスはこれから見るのでpop
q.pop();
// 現在のマスから上下左右を見る
for (int i = 0; i < 4; i++) {
// nx,nyが現在のマスから見ているマスの座標
int nx = n.first + vx[i];
int ny = n.second + vy[i];
// 範囲外アクセスをしないようにそのマスが迷路の外だったらcontinue
if (nx < 0 || w <= nx || ny < 0 || h <= ny) continue;
// そのマスが未訪問でかつ道のマスなら
if (d[ny][nx] == -1 && s[ny][nx] == '.') {
// そのマスの距離は現在のマスから+1で到達可能なので更新
d[ny][nx] = d[n.second][n.first] + 1;
// そのマスを訪問するべきマスとしてqueueにpush
q.push(make_pair(nx, ny));
}
}
}
return;
}
int main() {
// 縦と横を入力
int h, w;
cin >> h >> w;
// 迷路を入力
vector<string> s(h);
for (int i = 0; i < h; i++) cin >> s[i];
// スタート地点から各マスの最短距離(全てのマスを未訪問(-1)で初期化する)
vector<vector<int>> d(h, vector<int>(w, -1));
// BFSを行う
BFS(h, w, 0, 0, d, s);
// 結果を出力
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
printf("%2d%s", d[i][j], j < w - 1 ? " " : "\n");
}
}
return 0;
}