求助QWQ
#include<bits/stdc++.h>//本题牵涉到格与点但只不过要多判断x,y x+1,y x,y+1 x+1,y+1这几个即可
using namespace std;
int dx[4]={0,1,0,-1},
dy[4]={1,0,-1,0};
#define F(iii,aaa,bbb) for(int iii=aaa;iii<=bbb;iii++)//避免变量重复
int main()
{
int vis[60][60]={},m,n,mp[60][60],bfs[3600]={};
int k,x[3600]={},y[3600]={},toward[3600]={};//towand当前朝向
cin>>m>>n;
int bx,by,ex,ey;
F(i,1,m)
F(j,1,n){
cin>>mp[i][j];
}
char c;
cin>>bx>>by>>ex>>ey>>c;//东E,南S,西W,北N;
int s;
if(c=='E') s=0; if(c=='S') s=1; if(c=='W') s=2; if(c=='N') s=3;
x[1]=bx;
y[1]=by;
toward[1]=s;//toward作为偏移量的下标
bfs[1]=0;
vis[bx][by]=1;
int l=0,r=1;
int ans=0;
while(l<r){
l++;
int xx,yy;
xx=x[l]+dx[toward[l]];
yy=y[l]+dy[toward[l]];
if(!vis[xx][yy]&&xx>=1&&xx<=m&&yy>=1&&yy<=n&&
!mp[xx][yy]&&!mp[xx+1][yy]&&!mp[xx][yy+1]&&!mp[xx+1][yy+1]){//x,y x+1,y x,y+1 x+1,y+1
r++;
bfs[r]=bfs[l]+1;
x[r]=xx;
y[r]=yy;
toward[r]=toward[l];
vis[xx][yy]=1;
}
else
if(!vis[xx][yy])
goto out;
if(vis[ex][ey])
{
cout<<bfs[r];
return 0;
}
xx=x[l]+2*dx[toward[l]];
yy=y[l]+2*dy[toward[l]];
if(!vis[xx][yy]&&xx>=1&&xx<=m&&yy>=1&&yy<=n&&
!mp[xx][yy]&&!mp[xx+1][yy]&&!mp[xx][yy+1]&&!mp[xx+1][yy+1]){//x,y x+1,y x,y+1 x+1,y+1
r++;
bfs[r]=bfs[l]+1;
x[r]=xx;
y[r]=yy;
toward[r]=toward[l];
vis[xx][yy]=1;
}
else
if(!vis[xx][yy])
goto out;
if(vis[ex][ey])
{
cout<<bfs[r];
return 0;
}
xx=x[l]+3*dx[toward[l]];
yy=y[l]+3*dy[toward[l]];
if(!vis[xx][yy]&&xx>=1&&xx<=m&&yy>=1&&yy<=n&&
!mp[xx][yy]&&!mp[xx+1][yy]&&!mp[xx][yy+1]&&!mp[xx+1][yy+1]){//x,y x+1,y x,y+1 x+1,y+1
r++;
bfs[r]=bfs[l]+1;
x[r]=xx;
y[r]=yy;
toward[r]=toward[l];
vis[xx][yy]=1;
}
else
if(!vis[xx][yy])
goto out;
if(vis[ex][ey])
{
cout<<bfs[r];
return 0;
}
out:;//若第一个不满足且不是已经访问则后2个不可能可以走
if(toward[l]+1<=3){
r++;
bfs[r]=bfs[l]+1;
x[r]=x[l];
y[r]=y[l];
toward[r]=toward[l]+1;
}
if(toward[l]-1>=0){
r++;
bfs[r]=bfs[l]+1;
x[r]=x[l];
y[r]=y[l];
toward[r]=toward[l]-1;
}
}
cout<<-1;
return 0;
}