超多细节,值得重写很多遍。
#include<bits/stdc++.h>
using namespace std;
int X[]={-1,0,1,0},Y[]={0,1,0,-1};
int n,m,a[60][60];
bool vis[60][60][4];//访问标记(坐标+方向)
struct node{
int x,y,f,step;
};
bool check(int x,int y){//边界+障碍判断
if(x<1||y<1||x>=n||y>=m||a[x][y]||a[x+1][y]||a[x][y+1]||a[x+1][y+1]) return false;
return true;
}
int bfs(){
int x,y,edx,edy,f;
char ch;
scanf("%d%d%d%d %c",&x,&y,&edx,&edy,&ch);//%c前一定要有空格
switch(ch){
case'N':f=0;break;
case'E':f=1;break;
case'S':f=2;break;
case'W':f=3;break;
}
queue<node>q;
q.push({x,y,f,0});
while(!q.empty()){
node t=q.front();
q.pop();
x=t.x,y=t.y,f=t.f;
if(x==edx&&y==edy){
return t.step;
}
if(vis[x][y][f]) continue;
vis[x][y][f]=true;//
t.step++;//下面的向左转、向右转、前进1、2、3格,都会使步数加1
t.f=(f+4-1)%4;//向左转
q.push(t);
t.f=(f+4+1)%4;//向右转
q.push(t);
t.f=f;//原f
for(int i=1;i<=3;++i){
int nx=x+X[f]*i,ny=y+Y[f]*i;//这里必须是原x,原y 不能是t.x,t.y
if(!check(nx,ny))break; //如果向前走一步有障碍 就不可能向前走三步(即便第三步的格子上没障碍)一定要写成“如果不行就退出”的逻辑,不能写成“如果符合就进行”
t.x=nx,t.y=ny;
q.push(t);
}
}
return -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]);
}
}
printf("%d\n",bfs());
}