1 1 1 0
1 1 0 0
0 0 0 0
求所有0到1的最短距离
struct my
{
int x, y, z;
} wo;
int d[1001][1001];
int tag[1001][1001];
int main()
{
int cases, a, b;
scanf("%d", &cases);
while (cases--) {
scanf("%d%d", &a, &b);
int i, j;
memset(tag, 0, sizeof(tag));
queue<struct my> q;
for (i = 0; i < a; ++i) {
for (j = 0; j < b; ++j) {
scanf("%d", &d[i][j]);
if (d[i][j]) {
tag[i][j] = 1;
wo.x = i;
wo.y = j;
wo.z = 0;
q.push(wo);
}
}
}
int ans = 0;
while (!q.empty()) {
my t = q.front();
ans += t.z;
q.pop();
tag[t.x][t.y] = 1;
if (t.x > 0 && tag[t.x - 1][t.y] == 0) {
my tmp;
tmp.x = t.x - 1;
tmp.y = t.y;
tmp.z = t.z + 1;
q.push(tmp);
tag[t.x - 1][t.y] = 1;
}
if (t.y > 0 && tag[t.x][t.y - 1] == 0) {
my tmp;
tmp.x = t.x;
tmp.y = t.y - 1;
tmp.z = t.z + 1;
q.push(tmp);
tag[t.x][t.y - 1] = 1;
}
if (t.x + 1 < a && tag[t.x + 1][t.y] == 0) {
my tmp;
tmp.x = t.x + 1;
tmp.y = t.y;
tmp.z = t.z + 1;
q.push(tmp);
tag[t.x + 1][t.y] = 1;
}
if (t.y + 1 < b && tag[t.x][t.y + 1] == 0) {
my tmp;
tmp.x = t.x;
tmp.y = t.y + 1;
tmp.z = t.z + 1;
q.push(tmp);
tag[t.x][t.y + 1] = 1;
}
}
printf("%d\n", ans);
}
return 0;
}