样例死活过不去
#include<bits/stdc++.h>
#define ll long long
#define F(i,j,n) for(ll i=j;i<=n;i++)
#define B(i,j,n) for(ll i=j;i>=n;i--)
#define D double
#define Test ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int N=1e6+10,NN=1e4+10;
ll n,m,k,x,y,u,v,w,cnt=0,ans=0,t=0,l,r,len,T,d;
ll mini=INT_MAX,maxi=0,p=998244353;
string s1,s2;
char c;
ll a[55][55],vis[55][55][5];
ll d1[5]={0,-1,0,1,0};
ll d2[5]={0,0,1,0,-1};
struct Node{
ll x,y,step,d;
}S,E;
ll R(ll id){
if(id<4) return id+1;
return 1;
}
ll L(ll id){
if(id>1) return id-1;
return 4;
}
ll bfs(){
queue<Node> q;
q.push({S.x,S.y,0,d});
vis[S.x][S.y][d]=1;
while(!q.empty()){
Node p=q.front();
q.pop();
if(p.x==E.x&&p.y==E.y) return p.step;
if(!vis[p.x][p.y][R(p.d)]) vis[p.x][p.y][R(p.d)]=1,q.push({p.x,p.y,p.step+1,R(p.d)});
if(!vis[p.x][p.y][L(p.d)]) vis[p.x][p.y][L(p.d)]=1,q.push({p.x,p.y,p.step+1,L(p.d)});
F(i,1,3){
ll xx=p.x+d1[p.d]*i,yy=p.y+d2[p.d]*i;
if(!vis[xx][yy][p.d]&&xx>=1&&yy>=1&&xx<=n&&yy<=m&&!a[xx][yy]){
vis[xx][yy][p.d]=1;
q.push({xx,yy,p.step+1,p.d});
}
}
}
return -1;
}
int main(){
cin>>n>>m;
F(i,1,n) F(j,1,m){
cin>>x;
if(x) a[i-1][j]=a[i-1][j-1]=a[i][j]=a[i][j-1]=1;
}
cin>>S.x>>S.y>>E.x>>E.y>>c;
if(c=='N') d=1;
if(c=='E') d=2;
if(c=='S') d=3;
if(c=='W') d=4;
cout<<bfs();
return 0;
}