题目链接
做了一下午终于做出这道题了,真是恶心。
下面是Ac代码
import java.util.*;
public class Main {
public static int n,m,zhangAi[][],sx,sy,ex,ey;
public static int robot[][][],dx[]={0,1,0,-1},dy[]={1,0,-1,0},is[][][];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
zhangAi=new int[n][m];
robot=new int[n+1][m+1][2]; //0 is 1 dir
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
zhangAi[i][j]=sc.nextInt();
}
sx=sc.nextInt();
sy=sc.nextInt();
ex=sc.nextInt();
ey=sc.nextInt();
robot[sx][sy][0]=1;
char dir=sc.next().charAt(0);
if(dir=='E'){//you
robot[sx][sy][1]=0;
}
else if(dir=='S'){ //xia
robot[sx][sy][1]=1;
}
else if(dir=='W'){ //zuo
robot[sx][sy][1]=2;
}
else if(dir=='N'){ //shang
robot[sx][sy][1]=3;
}
System.out.println(bfs());
}
public static int bfs(){
Queue<int[]> q=new LinkedList<int[]>();
is=new int[n+1][m+1][4];
q.offer(new int[]{sx,sy,robot[sx][sy][1],0});
is[sx][sy][robot[sx][sy][1]]=1;
while(!q.isEmpty()){
int[] cur=q.poll();
int x=cur[0];
int y=cur[1];
int curdir=cur[2];
int curstep=cur[3];
if(x==ex&&y==ey)
return curstep;
if(is[x][y][(curdir+1+4)%4]==0){
is[x][y][(curdir+1+4)%4]=1;
q.offer(new int[]{x,y,(curdir+1+4)%4,curstep+1});
}
if(is[x][y][(curdir-1+4)%4]==0){
is[x][y][(curdir-1+4)%4]=1;
q.offer(new int[]{x,y,(curdir-1+4)%4,curstep+1});
}
for(int i=1;i<=3;i++){
int xx=x+dx[curdir]*i;
int yy=y+dy[curdir]*i;
if(xx<=0||yy<=0||xx>=n||yy>=m||!curdian(xx,yy)||predian(xx-dx[curdir],yy-dy[curdir])||is[xx][yy][curdir]==1)
continue;
q.offer(new int[]{xx,yy,curdir,curstep+1});
is[xx][yy][curdir]=1;
}
}
return -1;
}
public static boolean curdian(int x,int y){
return (zhangAi[x-1][y-1]!=1&&zhangAi[x][y-1]!=1&&zhangAi[x-1][y]!=1&&zhangAi[x][y]!=1);
}
public static boolean predian(int x,int y){ //zuoguo false
for(int i=0;i<4;i++){
if(is[x][y][i]!=0)
return false;
}
return true;
}
}