#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][1001][6]; int q[6000000]; main(){ read(0,rbuf,sizeof rbuf); char*rp=rbuf; rd(h); rd(w); rd(sy); rd(sx); rd(gy); rd(gx); ++w; long r=0; long qr=0,qw=0; q[qw++]=0|sx<<3|sy<<13; while(qr>3&1023; long y=q[qr]>>13; ++qr; if(y==gy&&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[(y-0)*w+(x-1)]=='.'){ long d2="\1\5\2\0\4\3"[d]; if(!v[y+1][x][d2]){ v[y+1][x][d2]=1; q[qw++]=d2|x<<3|y+1<<13; } } // x+1 if(rp[(y-1)*w+(x-0)]=='.'){ long d2="\2\1\5\3\0\4"[d]; if(!v[y][x+1][d2]){ v[y][x+1][d2]=1; q[qw++]=d2|x+1<<3|y<<13; } } // y-1 if(rp[(y-2)*w+(x-1)]=='.'){ long d2="\3\0\2\5\4\1"[d]; if(!v[y-1][x][d2]){ v[y-1][x][d2]=1; q[qw++]=d2|x<<3|y-1<<13; } } // x-1 if(rp[(y-1)*w+(x-2)]=='.'){ long d2="\4\1\0\3\5\2"[d]; if(!v[y][x-1][d2]){ v[y][x-1][d2]=1; q[qw++]=d2|x-1<<3|y<<13; } } } ++r; } write(1,"-1",2); _exit(0); }