import java.util.LinkedList;
import java.util.Queue;
class Solution {
static int[][] dir ={{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
static int n,m;
static int[][] dist;
static boolean[][] visit;
public int solution(int[][] maps) {
n=maps.length;
m=maps[0].length;
dist=new int[n][m];
visit=new boolean[n][m];
bfs(0,0,maps);
if(dist[n-1][m-1] == 0) {
return -1;
}
return dist[n-1][m-1];
}
static void bfs(int x, int y, int[][] maps){
n=maps.length;
m=maps[0].length;
Queue<Integer> q = new LinkedList<>();
for(int i=0; i<n-1; i++) {
for (int j = 0; j <m-1; j++) {
dist[i][j] = -1;
}
}
q.add(x);
q.add(y);
dist[x][y]=1;
visit[x][y]=true;
while (!q.isEmpty()){
x=q.poll();
y=q.poll();
for(int k=0; k<4; k++){
int nx=x+dir[k][0];
int ny=y+dir[k][1];
if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
if(maps[nx][ny] ==0) continue;
if(visit[nx][ny]) continue;
q.add(nx);
q.add(ny);
visit[nx][ny]=true;
dist[nx][ny]=dist[x][y]+1;
}
}
}
}