#include using namespace std; #define rep(i,n) for(int i=0;ib&&c>b) return true; return false; } int main(){ int w,h; cin>>w>>h; int m[h][w]; rep(i,h) rep(j,w) cin>>m[i][j]; rep(i,h) rep(j,w) bfs[0][i][j]=bfs[1][i][j]=1<<30; bfs[0][0][0]=bfs[1][0][0]=0; if(m[0][0]m[0][1]) bfs[1][0][1]=1; if(m[0][0]m[1][0]) bfs[1][1][0]=1; int mx[]={1,-1,0,0}; int my[]={0,0,1,-1}; queue> q; q.push(make_tuple(0,1,m[0][0],(bfs[0][0][1]==1?0:1))); q.push(make_tuple(1,0,m[0][0],(bfs[0][1][0]==1?0:1))); while(!q.empty()){ auto crt=q.front(); q.pop(); int y=get<0>(crt); int x=get<1>(crt); int before=get<2>(crt); int next=get<3>(crt); for(int i=0;i<4;i++){ if(0>y+my[i]||y+my[i]>=h||0>x+mx[i]||x+mx[i]>=w) continue; if(ok(before,m[y][x],m[y+my[i]][x+mx[i]])){ if(bfs[next^1][y+my[i]][x+mx[i]]!=(1<<30)) continue; bfs[next^1][y+my[i]][x+mx[i]]=bfs[next][y][x]+1; q.push(make_tuple(y+my[i],x+mx[i],m[x][y],next^1)); } } if(bfs[next][h-1][w-1]!=1<<30) break; } if(min(bfs[0][h-1][w-1],bfs[1][h-1][w-1])==(1<<30)) cout<<-1<