# 2. 题解

（这题我还 WA 了一次 T 了一次）

#include <bits/stdc++.h>

#define NS (1005)

using namespace std;

const int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};

template<typename _Tp> inline void IN(_Tp& dig)
{
char c; bool flag = 0; dig = 0;
while (c = getchar(), !isdigit(c)) if (c == '-') flag = 1;
while (isdigit(c)) dig = dig * 10 + c - '0', c = getchar();
if (flag) dig = -dig;
}

int n, m, dis[NS][NS], x[NS * NS], y[NS * NS], front, tail;

char str[NS];

void Bfs()
{
while (front < tail)
{
for (int i = 0; i < 4; i += 1)
{
int nx = x[front] + dx[i], ny = y[front] + dy[i];
if (nx < 1 || nx > n || ny < 1 || ny > m || dis[nx][ny] < 1e9)
continue;
dis[nx][ny] = dis[x[front]][y[front]] + 1;
x[tail] = nx, y[tail++] = ny;
}
front++;
}
}

int main(int argc, char const* argv[])
{
IN(n), IN(m), memset(dis, 0x3f, sizeof(dis));
for (int i = 1; i <= n; i += 1)
{
scanf("%s", str + 1);
for (int j = 1; j <= m; j += 1)
if (str[j] == '1') dis[i][j] = 0, x[tail] = i, y[tail++] = j;
}
Bfs();
for (int i = 1; i <= n; i += 1, putchar(10))
for (int j = 1; j <= m; j += 1)
printf("%d ", dis[i][j]);
return 0;
}