#pragma GCC optimize("Ofast") #pragma GCC target("avx2") char rbuf[1<<20]; #define rd(v) int v=0;{int _c;while(_c=*rp++-48,_c>=0)v=v*10+_c;} #define wt(v) {long _z=v;do*--wp=_z%10+48;while(_z/=10);} char v[1001*1002][6]; int q[6000000]; main(){ char*rp=rbuf+4096; read(0,rp,rp-rbuf+sizeof rbuf); rd(h); rd(w); rd(sy); rd(sx); rd(gy); rd(gx); ++w; sx=(sx-1)+(sy-1)*w; gx=(gx-1)+(gy-1)*w; long r=0; long qr=0,qw=0; q[qw++]=0|sx<<3; while(qr>3; ++qr; if(x==gx&&d==0){ char wbuf[64],*wp=wbuf+sizeof wbuf; wt(r); write(1,wp,wbuf+sizeof wbuf-wp); _exit(0); } // y+1 if(rp[x+w]=='.'){ long d2="\1\5\2\0\4\3"[d]; if(!v[x+w][d2]){ v[x+w][d2]=1; q[qw++]=d2|x+w<<3; } } // x+1 if(rp[x+1]=='.'){ long d2="\2\1\5\3\0\4"[d]; if(!v[x+1][d2]){ v[x+1][d2]=1; q[qw++]=d2|x+1<<3; } } // x-1 if(rp[x-1]=='.'){ long d2="\4\1\0\3\5\2"[d]; if(!v[x-1][d2]){ v[x-1][d2]=1; q[qw++]=d2|x-1<<3; } } // y-1 if(rp[x-w]=='.'){ long d2="\3\0\2\5\4\1"[d]; if(!v[x-w][d2]){ v[x-w][d2]=1; q[qw++]=d2|x-w<<3; } } } ++r; } write(1,"-1",2); _exit(0); }