#include <bits/stdc++.h>
using namespace std;
// Function to calculate the minimum time required to infect all healthy cells
int minTime(vector<vector<int>> ar) {
int n = ar.size();
int m = ar[0].size();
queue<pair<int, int>> q;
int healthy = 0; // count of healthy cells
int time = 0;
// Initialize queue with all infected cells
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (ar[i][j] == 2) q.push({i, j});
else if (ar[i][j] == 1) healthy++;
}
}
// Directions: up, down, left, right
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
// BFS traversal
while (!q.empty() && healthy > 0) {
int size = q.size();
while (size--) {
auto [x, y] = q.front();
q.pop();
for (int d = 0; d < 4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if (nx >= 0 && ny >= 0 && nx < n && ny < m && ar[nx][ny] == 1) {
ar[nx][ny] = 2; // infect the healthy cell
healthy--;
q.push({nx, ny});
}
}
}
time++; // one second passes after processing each level
}
// If some healthy cells are still left, return -1
return (healthy == 0) ? time : -1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<vector<int>> grid(N, vector<int>(M));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> grid[i][j];
}
}
cout << minTime(grid) << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1pbmltdW0gdGltZSByZXF1aXJlZCB0byBpbmZlY3QgYWxsIGhlYWx0aHkgY2VsbHMKaW50IG1pblRpbWUodmVjdG9yPHZlY3RvcjxpbnQ+PiBhcikgewogICAgaW50IG4gPSBhci5zaXplKCk7CiAgICBpbnQgbSA9IGFyWzBdLnNpemUoKTsKCiAgICBxdWV1ZTxwYWlyPGludCwgaW50Pj4gcTsKICAgIGludCBoZWFsdGh5ID0gMDsgICAgICAvLyBjb3VudCBvZiBoZWFsdGh5IGNlbGxzCiAgICBpbnQgdGltZSA9IDA7CgogICAgLy8gSW5pdGlhbGl6ZSBxdWV1ZSB3aXRoIGFsbCBpbmZlY3RlZCBjZWxscwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgICAgICBpZiAoYXJbaV1bal0gPT0gMikgcS5wdXNoKHtpLCBqfSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGFyW2ldW2pdID09IDEpIGhlYWx0aHkrKzsKICAgICAgICB9CiAgICB9CgogICAgLy8gRGlyZWN0aW9uczogdXAsIGRvd24sIGxlZnQsIHJpZ2h0CiAgICBpbnQgZHhbXSA9IHstMSwgMSwgMCwgMH07CiAgICBpbnQgZHlbXSA9IHswLCAwLCAtMSwgMX07CgogICAgLy8gQkZTIHRyYXZlcnNhbAogICAgd2hpbGUgKCFxLmVtcHR5KCkgJiYgaGVhbHRoeSA+IDApIHsKICAgICAgICBpbnQgc2l6ZSA9IHEuc2l6ZSgpOwogICAgICAgIHdoaWxlIChzaXplLS0pIHsKICAgICAgICAgICAgYXV0byBbeCwgeV0gPSBxLmZyb250KCk7CiAgICAgICAgICAgIHEucG9wKCk7CgogICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDQ7IGQrKykgewogICAgICAgICAgICAgICAgaW50IG54ID0geCArIGR4W2RdOwogICAgICAgICAgICAgICAgaW50IG55ID0geSArIGR5W2RdOwoKICAgICAgICAgICAgICAgIGlmIChueCA+PSAwICYmIG55ID49IDAgJiYgbnggPCBuICYmIG55IDwgbSAmJiBhcltueF1bbnldID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBhcltueF1bbnldID0gMjsgLy8gaW5mZWN0IHRoZSBoZWFsdGh5IGNlbGwKICAgICAgICAgICAgICAgICAgICBoZWFsdGh5LS07CiAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHtueCwgbnl9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aW1lKys7IC8vIG9uZSBzZWNvbmQgcGFzc2VzIGFmdGVyIHByb2Nlc3NpbmcgZWFjaCBsZXZlbAogICAgfQoKICAgIC8vIElmIHNvbWUgaGVhbHRoeSBjZWxscyBhcmUgc3RpbGwgbGVmdCwgcmV0dXJuIC0xCiAgICByZXR1cm4gKGhlYWx0aHkgPT0gMCkgPyB0aW1lIDogLTE7Cn0KCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgTiwgTTsKICAgIGNpbiA+PiBOID4+IE07CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGdyaWQoTiwgdmVjdG9yPGludD4oTSkpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBNOyBqKyspIHsKICAgICAgICAgICAgY2luID4+IGdyaWRbaV1bal07CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgbWluVGltZShncmlkKSA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0K