#include typedef long long ll; typedef unsigned long long ull; namespace multi_dimentional_vector { template void resize(std::vector &vec, size_t sz) { vec.resize(sz); } template void resize(std::vector &vec, size_t sz, const S &init) { vec.resize(sz, static_cast(init)); } template void resize(std::vector &vec, size_t sz, const S&... follows) { vec.resize(sz); for (auto &v : vec) resize(v, follows...); } template struct has_iterator { template static char test(typename U::iterator* x); template static long test(U* x); static const bool value = sizeof(test(0)) == 1; }; template typename std::enable_if::value, void>::type fill(std::vector& vec, const S &value) { std::fill(vec.begin(), vec.end(), static_cast(value)); } template typename std::enable_if::value, void>::type fill(std::vector& vec, const S &value) { for (auto &v : vec) fill(v, value); } template std::vector define(size_t sz, const S&... follows) { std::vector vec; return std::move(vec); } }; namespace mdv = multi_dimentional_vector; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() using namespace std; class PineDecorationSequence3 { public: void solve(void) { int W,H; cin>>W>>H; vector> M; mdv::resize(M,H,W); REP(y,H) REP(x,W) cin>>M[y][x]; // 1 // 0 * 2 // 3 vector>> vis; mdv::resize(vis,H,W,4,false); // 幅優先探索 queue> que; // (0,0) から次の移動場所を push する que.emplace(0,1,1,1); que.emplace(1,0,0,1); while ( !que.empty() ) { int x,y,p,t; tie(x,y,p,t) = que.front(); que.pop(); if ( x == W-1 && y == H-1 ) { cout< a3 = {M[py][px], M[y][x], M[ny][nx]}; sort(RANGE(a3)); if ( M[ny][nx] != a3[1] && M[py][px] != a3[1] ) continue; if ( a3[0] == a3[1] || a3[1] == a3[2] || a3[2] == a3[0]) continue; if ( vis[ny][nx][np] ) continue; que.emplace(nx,ny,np,t+1); vis[ny][nx][np] = true; } } cout<<-1<solve(); delete obj; return 0; } #endif