#include #include #include #include using namespace std; // N E S W constexpr array dr = {-1, 0, 1, 0}, dc = { 0, 1, 0,-1}; constexpr int dr_size = dr.size(); bool is_kado(int a, int b, int c) { if(a == 0) { return true; } return a!=c && ((a>b&&bc)); } int main(void) { constexpr int inf = 987654321; int C, R; scanf("%d%d", &C, &R); vector> G(R, vector(C, 0)); for(int r=0; r>>> cost(R, vector>>(C, vector>(10, vector(10, inf)))); // cost[R][C][10][10] cost[0][0][0][G[0][0]] = 0; vector>>> inque(R, vector>>(C, vector>(10, vector(10, false)))); // inque[R][C][10][10] inque[0][0][0][G[0][0]] = true; queue> que; que.emplace(0, 0, 0, G[0][0]); while(!que.empty()) { int r, c, b2, b1; tie(r, c, b2, b1) = que.front(); que.pop(); inque[r][c][b2][b1] = false; for(int i=0; i cost[r][c][b2][b1] + 1) { cost[nr][nc][b1][G[nr][nc]] = cost[r][c][b2][b1] + 1; if(!inque[nr][nc][b1][G[nr][nc]]) { inque[nr][nc][b1][G[nr][nc]] = true; que.emplace(nr, nc, b1, G[nr][nc]); } } } } int res = inf; for(int b2=0; b2<10; ++b2) { for(int b1=0; b1<10; ++b1) { res = min(res, cost[R-1][C-1][b2][b1]); } } if(res == inf) { res = -1; } printf("%d\n", res); return 0; }