#include using namespace std; #define rep(i, n) for(int i = 0; i < n; i++) #define rep2(i, x, n) for(int i = x; i <= n; i++) #define rep3(i, x, n) for(int i = x; i >= n; i--) #define each(e, v) for(auto &e: v) #define pb push_back #define eb emplace_back #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define sz(x) (int)x.size() using ll = long long; using pii = pair; using pil = pair; using pli = pair; using pll = pair; const int MOD = 1000000007; //const int MOD = 998244353; const int inf = (1<<30)-1; const ll INF = (1LL<<60)-1; template bool chmax(T &x, const T &y) {return (x < y)? (x = y, true) : false;}; template bool chmin(T &x, const T &y) {return (x > y)? (x = y, true) : false;}; struct io_setup{ io_setup(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout << fixed << setprecision(15); } } io_setup; int main(){ int H, W; cin >> H >> W; int N = H*W; int sx, sy, gx, gy; cin >> sx >> sy >> gx >> gy; sx--, sy--, gx--, gy--; vector S(H); rep(i, H) cin >> S[i]; vector dp(N*72, -1); queue que; int s = (sx*W+sy)*72+2; que.emplace(s); dp[s] = 0; int i, memo, x, y, t, d, k, r; int ni, nx, ny, nt, nd, nk, nr; vector dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1}; while(!empty(que)){ i = que.front(); que.pop(); memo = i; k = memo%2, memo/=2; d = memo%6, memo/=6; t = memo%6, memo/=6; y = memo%W, memo/=W; x = memo; r = (12-t-d)%3+3*k; if(x == gx && y == gy && t == 0){ cout << dp[i] << '\n'; return 0; } rep(j, 4){ nx = x+dx[j], ny = y+dy[j]; if(nx < 0 || nx >= H || ny < 0 || ny >= W) continue; if(S[nx][ny] == '#') continue; if(j == 0){ nt = (d+3)%6, nd = t, nr = r; } if(j == 1){ nt = (r+3)%6, nd = d, nr = t; } if(j == 2){ nt = d, nd = (t+3)%6, nr = r; } if(j == 3){ nt = r, nd = d, nr = (t+3)%6; } nk = (nr >= 3? 1 : 0); ni = (nx*W+ny)*72+nt*12+nd*2+nk; if(dp[ni] == -1){ dp[ni] = dp[i]+1; que.emplace(ni); } } } cout << "-1\n"; }