#include #include #include #include using ll = int64_t; const ll maxn = 1000+5; ll n,m; ll a[maxn][maxn]; struct D{ ll x,y,d; bool is2,ish; }; std::deque d; bool vis[maxn][maxn][4]; const ll dir[4][2]={ {1,0}, {-1,0}, {0,1}, {0,-1} }; int main(){ std::iostream::sync_with_stdio(false); std::cin.tie(nullptr); std::cin>>n>>m; for(ll i=1;i<=n;i++){ for(ll j=1;j<=m;j++){ std::cin>>a[i][j]; } } d.emplace_back(1,1,0,false); while (d.size()) { auto[x,y,dd,is2,ish] = d.front(); d.pop_front(); if(ish && a[x][y]==4){ ll nx = x+dir[dd][0], ny=y+dir[dd][1]; if(a[nx][ny]==3){ if(vis[nx][ny][is2])continue; }else if(a[nx][ny]==4){ if(vis[nx][ny][dd])continue; }else if(vis[nx][ny][0])continue; if(ll na=a[nx][ny];na==0){ continue; }else if(na==1){ d.emplace_back(nx,ny,dd,false,false); vis[nx][ny][0]=true; }else if(na==2){ d.emplace_back(nx,ny,dd,true,false); vis[nx][ny][0]=true; }else if(na==3){ continue; }else if(na==4){ d.emplace_back(nx,ny,dd,false,true); vis[nx][ny][dd]=true; } continue; } for(ll i=0;i<4;i++){ ll nx = x + dir[i][0], ny = y+dir[i][1]; if(ll na = a[nx][ny];na==0){ continue; }else if(na==1){ d.emplace_back(nx,ny,i,false,false); vis[nx][ny][0]=true; }else if(na==2){ d.emplace_back(nx,ny,i,true,false); vis[nx][ny][0]=true; }else if(na==3){ if(is2){ d.emplace_back(nx,ny,i,true,false); vis[nx][ny][is2]=true; } }else if(na==4){ d.emplace_back(nx,ny,i,false,true); vis[nx][ny][i]=true; } } } }