#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <time.h>
#include <queue>
#define mod 1000000000
#define ll long long int
using namespace std;
class point
{
public:
int x, y, z;
point(int i, int j, int k)
{
x = i;
y = j;
z = k;
}
};
int n, m;
int grid[200][200];
char board[200][200];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
void BFS(queue <point> bfs)
{
int i, j, x, y;
point temp(0,0,0);
while(!bfs.empty())
{
temp = bfs.front();
bfs.pop();
grid[temp.x][temp.y] = temp.z;
// if the adjacent cells are unvisited, pushing it onto the queue.
for(i=0; i<4; i++)
{
x = temp.x+dx[i];
y = temp.y+dy[i];
if(grid[x][y]==-1)
bfs.push(point(x,y,temp.z+1));
}
}
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
printf("%d ", grid[i][j]);
printf("\n");
}
}
int main()
{
int t, i, j;
scanf("%d", &t);
while(t--)
{
queue <point> bfs;
// taking input
scanf("%d %d", &n, &m);
for(i=0; i<n; i++)
scanf("%s", board[i]);
// putting the value for each point to be -1
for(i=0; i<n; i++)
for(j=0; j<m; j++)
grid[i][j] = -1;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
// if the point is white, putting its value to be 1, and pushing it onto the queue
if(board[i][j]=='1')
{
grid[i][j] = 0;
bfs.push(point(i,j,0));
}
}
}
BFS(bfs);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8cXVldWU+CiNkZWZpbmUgbW9kIDEwMDAwMDAwMDAKI2RlZmluZSBsbCBsb25nIGxvbmcgaW50Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgcG9pbnQKewogICAgcHVibGljOgogICAgICAgIGludCB4LCB5LCB6OwogICAgcG9pbnQoaW50IGksIGludCBqLCBpbnQgaykKICAgIHsKICAgICAgICB4ID0gaTsKICAgICAgICB5ID0gajsKICAgICAgICB6ID0gazsKICAgIH0KfTsKCmludCBuLCBtOwppbnQgZ3JpZFsyMDBdWzIwMF07CmNoYXIgYm9hcmRbMjAwXVsyMDBdOwoKaW50IGR4W10gPSB7MSwgLTEsIDAsIDB9OwppbnQgZHlbXSA9IHswLCAwLCAxLCAtMX07Cgp2b2lkIEJGUyhxdWV1ZSA8cG9pbnQ+IGJmcykKewogICAgaW50IGksIGosIHgsIHk7CiAgICBwb2ludCB0ZW1wKDAsMCwwKTsKICAgIHdoaWxlKCFiZnMuZW1wdHkoKSkKICAgIHsKICAgICAgICB0ZW1wID0gYmZzLmZyb250KCk7CiAgICAgICAgYmZzLnBvcCgpOwogICAgICAgIGdyaWRbdGVtcC54XVt0ZW1wLnldID0gdGVtcC56OwoKCQkvLyBpZiB0aGUgYWRqYWNlbnQgY2VsbHMgYXJlIHVudmlzaXRlZCwgcHVzaGluZyBpdCBvbnRvIHRoZSBxdWV1ZS4KICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHggPSB0ZW1wLngrZHhbaV07CiAgICAgICAgICAgIHkgPSB0ZW1wLnkrZHlbaV07CiAgICAgICAgICAgIGlmKGdyaWRbeF1beV09PS0xKQogICAgICAgICAgICAgICAgYmZzLnB1c2gocG9pbnQoeCx5LHRlbXAueisxKSk7CiAgICAgICAgfQogICAgfQogICAgZm9yKGk9MDsgaTxuOyBpKyspCiAgICB7CiAgICAgICAgZm9yKGo9MDsgajxtOyBqKyspCiAgICAgICAgICAgIHByaW50ZigiJWQgIiwgZ3JpZFtpXVtqXSk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGludCB0LCBpLCBqOwogICAgc2NhbmYoIiVkIiwgJnQpOwogICAgd2hpbGUodC0tKQogICAgewogICAgICAgIHF1ZXVlIDxwb2ludD4gYmZzOwogICAgICAgIAogICAgICAgIC8vIHRha2luZyBpbnB1dAogICAgICAgIHNjYW5mKCIlZCAlZCIsICZuLCAmbSk7CiAgICAgICAgZm9yKGk9MDsgaTxuOyBpKyspCiAgICAgICAgICAgIHNjYW5mKCIlcyIsIGJvYXJkW2ldKTsKCgkJLy8gcHV0dGluZyB0aGUgdmFsdWUgZm9yIGVhY2ggcG9pbnQgdG8gYmUgLTEKICAgICAgICBmb3IoaT0wOyBpPG47IGkrKykKICAgICAgICAgICAgZm9yKGo9MDsgajxtOyBqKyspCiAgICAgICAgICAgIGdyaWRbaV1bal0gPSAtMTsKCiAgICAgICAgZm9yKGk9MDsgaTxuOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBmb3Ioaj0wOyBqPG07IGorKykKICAgICAgICAgICAgewogICAgICAgICAgICAJLy8gaWYgdGhlIHBvaW50IGlzIHdoaXRlLCBwdXR0aW5nIGl0cyB2YWx1ZSB0byBiZSAxLCBhbmQgcHVzaGluZyBpdCBvbnRvIHRoZSBxdWV1ZQogICAgICAgICAgICAgICAgaWYoYm9hcmRbaV1bal09PScxJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBncmlkW2ldW2pdID0gMDsKICAgICAgICAgICAgICAgICAgICBiZnMucHVzaChwb2ludChpLGosMCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEJGUyhiZnMpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCg==