#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define double long double
#define print(a) for(auto x : a) cout << x << " "; cout << endl
inline int power(int a, int b) {
int x = 1;
while (b) {
if (b & 1) x *= a;
a *= a;
b >>= 1;
}
return x;
}
const int M = 1000000007;
const int N = 3e5+9;
const int INF = 2e9+1;
const int LINF = 2000000000000000001;
//_ ***************************** START Below *******************************
vector<vector<int>> a;
vector<vector<int>> dirs = {{0, 1} , {1, 0} , {0, -1}, {-1, 0} };
queue<pair<int,int>> q;
vector<vector<bool>> visited;
vector<vector<int>> lvl;
void dfs(int x, int y, int m, int n){
visited[x][y] = true;
a[x][y] = 2;
bool anyChildZero = false;
for(auto& dir : dirs){
int i = x + dir[0];
int j = y + dir[1];
if(i<0 || i>=m || j<0 || j>=n) continue;
if(a[i][j] == 0) anyChildZero = true;
if(a[i][j] == 0 || visited[i][j]) continue;
dfs(i, j, m, n);
}
if(anyChildZero) q.push({x,y});
}
//* Eg :
//* 0 0 0 0 0 0 0
//* 0 1 1 1 0 0 0
//* 0 1 0 1 0 0 0
//* 0 1 1 1 0 0 0
//* 0 0 0 0 0 1 1
//* 0 0 0 0 1 1 1
//* 0 0 0 0 0 1 0
//? Interview Approach :
//* Do bfs from all nodes of Island 1 (i.e. internal nodes also )
//* Optimized Approach :
//* We are only interested in distance from boundary of island 1 to all other nodes
//* Do bfs from Boundary nodes only of Island 1
//* Even if bfs find distance of inside nodes of Island 1 , we don tcare,
//* we only calculate ans for island 2 later while traversing
//* How to BFS island 1 ?
//* 1. Store all nodes of island 1 in Hashmap
//* Do boundary bfs from boundary nodes only
//* Island 2 nodes can be identified in O(1) check using Hashmap
//* OR
//* 2. Color the nodes of island 1 (inplace or with separate matrix)
//* Island 2 can be identified with a[i][j] == 1 (2 is for Island 1)
void consistency(int m, int n){
visited.resize(m, vector<bool>(n, false));
lvl.resize(m, vector<int>(n, 0));
for(int i=0; i<m; i++){
bool isFirstIslandTraversed = false;
for(int j=0; j<n; j++){
if(a[i][j] == 1) {
dfs(i,j, m, n);
isFirstIslandTraversed = true;
break;
}
}
if(isFirstIslandTraversed) break;
}
int mini = INF;
while(!q.empty()){
auto u = q.front(); q.pop();
int x = u.first;
int y = u.second;
for(auto& dir : dirs){
int i = x + dir[0];
int j = y + dir[1];
if(i<0 || i>=m || j<0 || j>=n || visited[i][j]) continue;
q.push({i, j});
visited[i][j] = true;
lvl[i][j] = lvl[x][y] + 1;
//* Min Distance calculation
if(a[i][j] == 1) mini = min(mini, lvl[i][j]);
}
}
//* Further Optimization :
//* Calculate mini directly above (not here)
// for(int i=0; i<m; i++){
// for(int j=0; j<n; j++){
// if( a[i][j] == 0 || a[i][j] == 2) continue;
// mini = min(mini, lvl[i][j]);
// }
// }
cout << mini-1 << endl;
}
void solve() {
int m, n;
cin>>m >> n;
a.resize(m, vector<int>(n, 0));
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
cin >> a[i][j];
}
}
consistency(m, n);
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50ICAgICAgICAgICAgICBsb25nIGxvbmcgaW50CiNkZWZpbmUgZG91YmxlICAgICAgICAgICBsb25nIGRvdWJsZQojZGVmaW5lIHByaW50KGEpICAgICAgICAgZm9yKGF1dG8geCA6IGEpIGNvdXQgPDwgeCA8PCAiICI7IGNvdXQgPDwgZW5kbAppbmxpbmUgaW50IHBvd2VyKGludCBhLCBpbnQgYikgewogICAgaW50IHggPSAxOwogICAgd2hpbGUgKGIpIHsKICAgICAgICBpZiAoYiAmIDEpIHggKj0gYTsKICAgICAgICBhICo9IGE7CiAgICAgICAgYiA+Pj0gMTsKICAgIH0KICAgIHJldHVybiB4Owp9CgoKY29uc3QgaW50IE0gPSAxMDAwMDAwMDA3Owpjb25zdCBpbnQgTiA9IDNlNSs5Owpjb25zdCBpbnQgSU5GID0gMmU5KzE7CmNvbnN0IGludCBMSU5GID0gMjAwMDAwMDAwMDAwMDAwMDAwMTsKCi8vXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBCZWxvdyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgp2ZWN0b3I8dmVjdG9yPGludD4+IGE7CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gZGlycyA9IHt7MCwgMX0gLCB7MSwgMH0gLCB7MCwgLTF9LCB7LTEsIDB9IH07CnF1ZXVlPHBhaXI8aW50LGludD4+IHE7CnZlY3Rvcjx2ZWN0b3I8Ym9vbD4+IHZpc2l0ZWQ7CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gbHZsOwoKdm9pZCBkZnMoaW50IHgsIGludCB5LCBpbnQgbSwgaW50IG4pewoJCgl2aXNpdGVkW3hdW3ldID0gdHJ1ZTsKCWFbeF1beV0gPSAyOwoJCglib29sIGFueUNoaWxkWmVybyA9IGZhbHNlOwoJZm9yKGF1dG8mIGRpciA6IGRpcnMpewoJCWludCBpID0geCArIGRpclswXTsKCQlpbnQgaiA9IHkgKyBkaXJbMV07CgkJCgkJaWYoaTwwIHx8IGk+PW0gfHwgajwwIHx8IGo+PW4pIGNvbnRpbnVlOwoJCWlmKGFbaV1bal0gPT0gMCkgYW55Q2hpbGRaZXJvID0gdHJ1ZTsKCQkKCQlpZihhW2ldW2pdID09IDAgfHwgdmlzaXRlZFtpXVtqXSkgY29udGludWU7CgkJZGZzKGksIGosIG0sIG4pOwoJfQoJCglpZihhbnlDaGlsZFplcm8pIHEucHVzaCh7eCx5fSk7CgkKfQoKCi8vKiBFZyA6IAovLyogCTAgMCAwIDAgMCAwIDAgCi8vKiAJMCAxIDEgMSAwIDAgMAovLyogCTAgMSAwIDEgMCAwIDAgCi8vKiAJMCAxIDEgMSAwIDAgMCAKLy8qIAkwIDAgMCAwIDAgMSAxCi8vKiAJMCAwIDAgMCAxIDEgMQovLyogCTAgMCAwIDAgMCAxIDAKCi8vPyBJbnRlcnZpZXcgQXBwcm9hY2ggIDogCi8vKiAJRG8gYmZzIGZyb20gYWxsIG5vZGVzIG9mIElzbGFuZCAxIChpLmUuIGludGVybmFsIG5vZGVzIGFsc28gKQoKLy8qIE9wdGltaXplZCBBcHByb2FjaCA6IAovLyogCVdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZGlzdGFuY2UgZnJvbSBib3VuZGFyeSBvZiBpc2xhbmQgMSB0byBhbGwgb3RoZXIgbm9kZXMKLy8qIAlEbyBiZnMgZnJvbSBCb3VuZGFyeSBub2RlcyBvbmx5IG9mIElzbGFuZCAxCi8vKiAJRXZlbiBpZiBiZnMgZmluZCBkaXN0YW5jZSBvZiBpbnNpZGUgbm9kZXMgb2YgSXNsYW5kIDEgLCB3ZSBkb24gdGNhcmUsIAovLyogCQl3ZSBvbmx5IGNhbGN1bGF0ZSBhbnMgZm9yIGlzbGFuZCAyIGxhdGVyIHdoaWxlIHRyYXZlcnNpbmcKCgovLyogSG93IHRvIEJGUyBpc2xhbmQgMSA/IAovLyogCTEuIFN0b3JlIGFsbCBub2RlcyBvZiBpc2xhbmQgMSBpbiBIYXNobWFwIAovLyogCSAgIERvIGJvdW5kYXJ5IGJmcyBmcm9tIGJvdW5kYXJ5IG5vZGVzIG9ubHkKLy8qIAkgICBJc2xhbmQgMiBub2RlcyBjYW4gYmUgaWRlbnRpZmllZCBpbiBPKDEpIGNoZWNrIHVzaW5nIEhhc2htYXAKLy8qIAkJCQkJT1IJCQovLyogCTIuIENvbG9yIHRoZSBub2RlcyBvZiBpc2xhbmQgMSAoaW5wbGFjZSBvciB3aXRoIHNlcGFyYXRlIG1hdHJpeCkKLy8qIAkJSXNsYW5kIDIgY2FuIGJlIGlkZW50aWZpZWQgd2l0aCBhW2ldW2pdID09IDEgKDIgaXMgZm9yIElzbGFuZCAxKQoKCnZvaWQgY29uc2lzdGVuY3koaW50IG0sIGludCBuKXsKCQoJdmlzaXRlZC5yZXNpemUobSwgdmVjdG9yPGJvb2w+KG4sIGZhbHNlKSk7CglsdmwucmVzaXplKG0sIHZlY3RvcjxpbnQ+KG4sIDApKTsKCQoJZm9yKGludCBpPTA7IGk8bTsgaSsrKXsKCQlib29sIGlzRmlyc3RJc2xhbmRUcmF2ZXJzZWQgPSBmYWxzZTsKCQlmb3IoaW50IGo9MDsgajxuOyBqKyspewoJCQlpZihhW2ldW2pdID09IDEpIHsKCQkJCWRmcyhpLGosIG0sIG4pOwoJCQkJaXNGaXJzdElzbGFuZFRyYXZlcnNlZCA9IHRydWU7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlpZihpc0ZpcnN0SXNsYW5kVHJhdmVyc2VkKSBicmVhazsKCX0KCQoJCglpbnQgbWluaSA9IElORjsKCQoJd2hpbGUoIXEuZW1wdHkoKSl7CgkJCgkJYXV0byB1ID0gcS5mcm9udCgpOyBxLnBvcCgpOwoJCQoJCWludCB4ID0gdS5maXJzdDsKCQlpbnQgeSA9IHUuc2Vjb25kOwoJCQoJCWZvcihhdXRvJiBkaXIgOiBkaXJzKXsKCQkJaW50IGkgPSB4ICsgZGlyWzBdOwoJCQlpbnQgaiA9IHkgKyBkaXJbMV07CgkJCQoJCQlpZihpPDAgfHwgaT49bSB8fCBqPDAgfHwgaj49biB8fCAgdmlzaXRlZFtpXVtqXSkgY29udGludWU7CgkJCXEucHVzaCh7aSwgan0pOwoJCQl2aXNpdGVkW2ldW2pdID0gdHJ1ZTsKCQkJbHZsW2ldW2pdID0gbHZsW3hdW3ldICsgMTsKCQkJCgkJCS8vKiBNaW4gRGlzdGFuY2UgY2FsY3VsYXRpb24KCQkJaWYoYVtpXVtqXSA9PSAxKSBtaW5pID0gbWluKG1pbmksIGx2bFtpXVtqXSk7CgkJfQoJCQoJfQoJCgkKCS8vKiBGdXJ0aGVyIE9wdGltaXphdGlvbiA6IAoJLy8qIENhbGN1bGF0ZSBtaW5pIGRpcmVjdGx5IGFib3ZlIChub3QgaGVyZSkKCQoJLy8gZm9yKGludCBpPTA7IGk8bTsgaSsrKXsKCS8vIAlmb3IoaW50IGo9MDsgajxuOyBqKyspewoJLy8gCQlpZiggYVtpXVtqXSA9PSAwIHx8IGFbaV1bal0gPT0gMikgY29udGludWU7CgkvLyAJCW1pbmkgPSBtaW4obWluaSwgbHZsW2ldW2pdKTsKCS8vIAl9CgkvLyB9CgoJY291dCA8PCBtaW5pLTEgPDwgZW5kbDsKCn0KCgoKCgoKCgoKCnZvaWQgc29sdmUoKSB7CiAgICAKICAgIGludCBtLCBuOwogICAgY2luPj5tID4+IG47CiAgICBhLnJlc2l6ZShtLCB2ZWN0b3I8aW50PihuLCAwKSk7CiAgICBmb3IoaW50IGk9MDsgaTxtOyBpKyspewogICAgCWZvcihpbnQgaj0wOyBqPG47IGorKyl7CiAgICAJCWNpbiA+PiBhW2ldW2pdOwogICAgCX0KICAgIH0KICAgIAogICAgY29uc2lzdGVuY3kobSwgbik7CgoKfQoKCgoKCmludDMyX3QgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwoKICAgIGludCB0ID0gMTsKICAgIC8vIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=