#include #include #include #include #include #include using namespace std; int W, H; int DP[101][101][4]; int dx[4] = { 0,1,0,-1 }; int dy[4] = { -1,0,1,0 }; vector >M; void bfs() { for (int i = 0; i < 101; i++)for (int j = 0; j < 101; j++)for (int k = 0; k < 4; k++)DP[i][j][k] = INT32_MAX; DP[0][1][0] = 1; DP[1][0][3] = 1; queue > que; que.push(make_pair(W,0)); que.push(make_pair(1,3)); while (!que.empty()) { pair v = que.front(); que.pop(); int y = v.first / W; int x = v.first % W; int p_y = y + dy[v.second]; int p_x = x + dx[v.second]; for (int i = 0; i < 4; i++) { int n_y = y + dy[i]; int n_x = x + dx[i]; if (n_x<0 || n_y<0 || n_x>=W || n_y>=H)continue; if (DP[n_x][n_y][(i + 2) % 4] <= DP[x][y][v.second] + 1)continue; if (M[y][x] == M[p_y][p_x] || M[y][x] == M[n_y][n_x] || M[p_y][p_x]==M[n_y][n_x])continue; if((M[p_y][p_x] M[y][x] && M[y][x] > M[n_y][n_x]))continue; DP[n_x][n_y][(i + 2) % 4] = DP[x][y][v.second] + 1; que.push(make_pair(W*n_y + n_x, (i + 2) % 4)); } } } int main() { cin >> W >> H; M.resize(H); for (int i = 0; i < H; i++) { M[i].resize(W); for (int j = 0; j < W; j++) { cin >> M[i][j]; } } bfs(); int ans = min(DP[W - 1][H - 1][0], DP[W - 1][H - 1][3]); if (ans == INT32_MAX)cout << -1 << endl; else cout << ans << endl; return 0; }