#include #include #include #include #include #include #include #include #include #include #include #include #include #define fi first #define se second #define rep(i,n) for(ll i=0;i<(n);i++) #define rrep(i,n) for(ll i=(n)-1;i>=0;i--) #define orep(i,n) for(ll i=1;i<=(n);i++) #define nfor(i,s,n) for(ll i=(s);i<(n);i++) #define dfor(i,s,n) for(ll i=(s)-1;i>=n;i--) #define INF 9e18//9223372036854775807 #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define chmax(x,y) x = max(x,y) #define chmin(x,y) x = min(x,y) #define pb push_back #define pob pop_back #define vc vector #define YES cout << "Yes" << endl; #define NO cout << "No" << endl; #define YN {cout << "Yes" << endl;}else{cout << "No" << endl;} #define dame cout << -1 << endl; #define vc_unique(v) v.erase(unique(v.begin(), v.end()), v.end()) #define vc_rotate(v) rotate(v.begin(), v.begin()+1, v.end()) #define pop_cnt(s) ll(popcount(uint64_t(s))) #define next_p(v) next_permutation(v.begin(),v.end()) #ifndef ONLINE_JUDGE #define _GLIBCXX_DEBUG #endif using namespace std; using ll = long long; using ld = long double; using pll = pair; using vvl = vector>; using vl = vector; using Graph = vector>; template using pq = priority_queue,less>; template using pq_g = priority_queue,greater>; vl dx = {1,-1,0,0};//vl dx = {1,1,0,-1,-1,-1,0,1}; vl dy = {0,0,1,-1};//vl dy = {0,1,1,1,0,-1,-1,-1}; bool out_grid(ll i, ll j, ll h, ll w){//trueならcontinueする return(!(0 <= i && i < h && 0 <= j && jsosu(20001,0); sosu[1] = 1; nfor(i,2,450){ if(sosu[i] != 0)continue; else{ ll j = 2; while(j*i < 20001){ sosu[j*i]++; j++; } } } ll H,W; cin >> H >> W; ll Sx,Sy; ll Gx,Gy; cin >> Sx >> Sy; cin >> Gx >> Gy; Sx--;Sy--; Gx--;Gy--; vector> G(H,vc(W)); rep(i,H)rep(j,W){ cin >> G[i][j]; } vvl dist(H,vl(W,-1)); vector> pre(H,vc(W,{-1,-1})); queue que; que.push({Sx,Sy}); dist[Sx][Sy] = 0; bool F = false; while(!que.empty() && !F){ ll x = que.front().fi; ll y = que.front().se; que.pop(); rep(i,4){ ll nx = x + dx[i]; ll ny = y + dy[i]; if(nx >= H || ny >= W || nx < 0 || ny < 0)continue; if(G[nx][ny] == '#')continue; if(dist[nx][ny] != -1)continue; dist[nx][ny] = dist[x][y] + 1; pre[nx][ny] = {x,y}; if(nx == Gx && ny == Gy){ F = true; break; }else{ que.push({nx,ny}); } } } ll x = Gx;ll y = Gy; ll A = 0; ll B = 0; ll C = 0; ll D = 0; bool tate = false; bool yoko = false; while(!(x == Sx && y == Sy)){ rep(i,4){ ll nx = x + dx[i]; ll ny = y + dy[i]; if(nx >= H || ny >= W || nx < 0 || ny < 0)continue; if(G[nx][ny] != '#'){ if(i == 0 || i == 1){ tate = true; }else{ yoko = true; } } } ll prex = pre[x][y].fi; ll prey = pre[x][y].se; if(x - prex == 1)A++; if(x - prex == -1)B++; if(y - prey == 1)C++; if(y - prey == -1)D++; x = prex;y = prey; } rep(i,4){ ll nx = x + dx[i]; ll ny = y + dy[i]; if(nx >= H || ny >= W || nx < 0 || ny < 0)continue; if(G[nx][ny] != '#'){ if(i == 0 || i == 1){ tate = true; }else{ yoko = true; } } } bool mAB = false; bool mCD = false; if(!(tate && yoko))dame else{ if(A == 0 || B == 0){ A++;B++; } while(A<20000 && B<20000){ if(sosu[A] == 0 && sosu[B] == 0){ mAB = true; break; } else{ A++;B++; } } if(C == 0 || D == 0){ C++;D++; } while(C<20000 && D<20000){ if(sosu[C] == 0 && sosu[D] == 0){ mCD = true; break; } else{ C++;D++; } } if(mAB && mCD)cout << A+B+C+D << endl; else dame } }