#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N = 1010;
PII q[N * N];
int x[N][N],y[N][N];
int m,n;
int bfs(){
memset (y, -1, sizeof y);
y[1][1] = 0;
int dx[4] = {0,-1,0,1};
int dy[4] = {-1,0,1,0};
int h = 1,k = 1;
q[1] = {1,1};
while(h <= k) {
auto b = q[h ++];
for (int i = 0; i <= 3; i ++ ){
int xx = b.first + dx[i];
int yy = b.second + dy[i];
if(xx > 0 && xx <= m && yy > 0 && yy <= n && x[xx][yy] == 0 && y[xx][yy] == -1)
{
y[xx][yy] = y[b.first][b.second] + 1;
q[++ k] = {xx,yy};
}
}
}
return y[m][n];
}
int main(){
cin >> m >> n;
for (int i = 1; i <= m; i ++ ) {
for (int j = 1; j <= n; j ++ ) cin >> x[i][j];
}
cout << bfs() << endl;
return 0;
}
//走迷宫问题bfs;
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N = 1010;
PII q[N * N];
int x[N][N],y[N][N];
int m,n;
int bfs(){
memset (y, -1, sizeof y);
y[0][0] = 0;
int dx[4] = {0,-1,0,1};
int dy[4] = {-1,0,1,0};
int h = 0,k = 0;
q[0] = {0,0};
while(h <= k) {
auto b = q[h ++];
for (int i = 0; i <= 3; i ++ ){
int xx = b.first + dx[i];
int yy = b.second + dy[i];
if(xx >= 0 && xx < m && yy >= 0 && yy < n && x[xx][yy] == 0 && y[xx][yy] == -1)
{
y[xx][yy] = y[b.first][b.second] + 1;
q[++ k] = {xx,yy};
}
}
}
return y[m - 1][n - 1];
}
int main(){
cin >> m >> n;
for (int i = 0; i < m; i ++ ) {
for (int j = 0; j < n; j ++ ) cin >> x[i][j];
}
cout << bfs() << endl;
return 0;
}