cpp
#include<bits/stdc++.h>
using namespace std;
int a[60][60];
struct node{
int x,y,cnt;
char f;
node():x(),y(),cnt(),f(){}
node(int x,int y,int cnt,char f):x(x),y(y),cnt(cnt),f(f){}
};
queue<node> q;
int n,m;
void szfw(int x,int y,int ans,char ff)
{
if(ff=='S')
{
for(int i=1;i<=3;i++)
if(x+i<=n && a[x+i][y]==0)
q.push(node(x+i,y,ans+1,'S'));
}
if(ff=='N')
{
for(int i=1;i<=3;i++)
if(x-i>=1 && a[x-i][y]==0)
q.push(node(x-i,y,ans+1,'N'));
}
if(ff=='E')
{
for(int i=1;i<=3;i++)
if(y-i>=1 && a[x][y-i]==0)
q.push(node(x,y-i,ans+1,'E'));
}
if(ff=='W')
{
for(int i=1;i<=3;i++)
if(y+i<=m && a[x][y+i]==0)
q.push(node(x,y+i,ans+1,'W'));
}
}
int sx,sy,ex,ey;
char fx[4]={'S','N','E','W'};
char F;
void dfs()
{
q.push(node(sx,sy,0,F));
bool fl=false;
while(q.size())
{
int x=q.front().x,y=q.front().y,ans=q.front().cnt;
char f=q.front().f;q.pop();
if(x==ex && y==ey)
{
fl=true;
printf("%d",ans);
break;
}
szfw(x,y,ans,f);
//if(ans>Min)
// continue;
for(int i=0;i<4;i++)
q.push(node(x,y,ans+1,fx[i]));
}
if(!fl)
printf("-1");
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
scanf("%d%d%d%d%c",&sx,&sy,&ex,&ey,&F);
dfs();
return 0;
}