调了好久。。。(人都要爆了)
我以左上角为边界
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const int N=5e5+10;
struct node{
int x,y,sum,dir;
}t,tt;
int cx[5]={0,0,1,0,-1};
int cy[5]={0,1,0,-1,0};
bool a[100][100];
bool vis[100][100][4];
int n,m,sx,sy,ex,ey,dir_now;
bool flag;
char c;
bool judge(int tx,int ty,int dir)
{
bool ok=1;
if(tx>=1&&ty>=1&&tx<=n-2&&ty<=m-2&&vis[tx][ty][dir]==0)
{
if(a[tx][ty]==1||a[tx][ty+1]==1||a[tx+1][ty]==1||a[tx+1][ty+1]==1) return 0;
vis[tx][ty][t.dir]=1;
return 1;
}
return 0;
}
queue<node> q;
int main()
{
cin>>n>>m;
memset(a,1,sizeof(a));
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin>>a[i][j];
}
}
cin>>sx>>sy>>ex>>ey>>c;
if(c=='E') dir_now=1;
if(c=='S') dir_now=2;
if(c=='W') dir_now=3;
if(c=='N') dir_now=4;
q.push((node){sx,sy,0,dir_now});
vis[sx][sy][dir_now]=1;
//E S W N -> 1 2 3 4
while(!q.empty())
{
t=q.front(); q.pop();
if(t.x==ex&&t.y==ey)
{
cout<<t.sum<<endl;
return 0;
}
if(t.dir==1)
{
for(int i=1;i<=3;++i)
{
if(judge(t.x,t.y+i,t.dir)) q.push((node){t.x,t.y+i,t.sum+1,1});
}
if(judge(t.x+1,t.y,2)) q.push((node){t.x,t.y,t.sum+1,2});
if(judge(t.x,t.y-1,3)) q.push((node){t.x,t.y,t.sum+2,3});
if(judge(t.x-1,t.y,4)) q.push((node){t.x,t.y,t.sum+1,4});
continue;
}
else if(t.dir==2)
{
for(int i=1;i<=3;++i)
{
if(judge(t.x+i,t.y,t.dir)) q.push((node){t.x+i,t.y,t.sum+1,2});
}
if(judge(t.x,t.y-1,3)) q.push((node){t.x,t.y,t.sum+1,3});
if(judge(t.x-1,t.y,4)) q.push((node){t.x,t.y,t.sum+2,4});
if(judge(t.x,t.y+1,1)) q.push((node){t.x,t.y,t.sum+1,1});
continue;
}
else if(t.dir==3)
{
for(int i=1;i<=3;++i)
{
if(judge(t.x,t.y-i,t.dir)) q.push((node){t.x,t.y-i,t.sum+1,3});
}
if(judge(t.x-1,t.y,4)) q.push((node){t.x,t.y,t.sum+1,4});
if(judge(t.x,t.y+1,1)) q.push((node){t.x,t.y,t.sum+2,1});
if(judge(t.x+1,t.y,2)) q.push((node){t.x,t.y,t.sum+1,2});
continue;
}
else if(t.dir==4)
{
for(int i=1;i<=3;++i)
{
if(judge(t.x-i,t.y,t.dir)) q.push((node){t.x-i,t.y,t.sum+1,4});
}
if(judge(t.x,t.y+1,1)) q.push((node){t.x,t.y,t.sum+1,1});
if(judge(t.x+1,t.y,2)) q.push((node){t.x,t.y,t.sum+2,2});
if(judge(t.x,t.y-1,3)) q.push((node){t.x,t.y,t.sum+1,3});
continue;
}
}
cout<<-1<<endl;
return 0;
}