#include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 4000000000000000001LL bool is_p(int n){ if(n==0)return false; if(n == 2) return true; if(n == 1 || n % 2 == 0) return false; for(int i = 3; i * i <= n; i += 2){ if(n % i == 0) return false; } return true; } int main(){ vector> dis(45); rep(i,900){ rep(j,45){ if(is_p(i)&&is_p(i+j)){ dis[j].push_back(i); } } } int h,w; cin>>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]; s[sx][sy] = '.'; s[gx][gy] = '.'; vector d(h,vector(w,vector(900,vector(2,Inf32)))); d[sx][sy][0][0] = 0; deque> Q; Q.push_back({sx,sy,0,0}); while(Q.size()>0){ vector dx = {1,-1,0,0},dy = {0,0,1,-1}; int x = Q.front()[0],y = Q.front()[1],t = Q.front()[2],k = Q.front()[3]; Q.pop_front(); rep(i,4){ int nx = x+dx[i],ny = y+dy[i]; if(nx<0||nx>=h||ny<0||ny>=w)continue; if(s[nx][ny] == '#')continue; int nt = t,nk = k; if(i==0)nt++; if(i>=2)nk = 1; if(nt >= 900)continue; int nd = d[x][y][t][k]; if(i==2)nd++; if(nd>=d[nx][ny][nt][nk])continue; else{ d[nx][ny][nt][nk] = nd; if(i!=2)Q.push_front({nx,ny,nt,nk}); else Q.push_back({nx,ny,nt,nk}); } } } int ans = Inf32; rep(i,900){ int cur = 0; { int dd = gx - sx; int ii = i; if(dd < 0)ii = i-dd; dd = abs(dd); int tt = distance(dis[dd].begin(),lower_bound(dis[dd].begin(),dis[dd].end(),ii)); if(tt == dis[dd].size())continue; cur += dis[dd][tt] * 2 + dd; } { int dd = gy - sy; int ii = d[gx][gy][i][1]; if(ii==Inf32)continue; if(dd < 0)ii = i-dd; dd = abs(dd); int tt = distance(dis[dd].begin(),lower_bound(dis[dd].begin(),dis[dd].end(),ii)); if(tt == dis[dd].size())continue; cur += dis[dd][tt] * 2 + dd; } ans = min(ans,cur); } if(ans == Inf32)cout<<-1<