将所有选择循环化,用数字记忆搜索状态,坐标 x=f[k][0] y=f[k][1]; 方向=f[k][2], 时间=f[k][3];
题目需要将地图转化,障碍物在格子里,机器人在点上,并且占位4格,
特殊情况,起点或终点在障碍物上,或不能占位机器人。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=55;
char F;
int n,m,sx,sy,ex,ey,ans,K;
int f[N*N*N][4],map1[N][N],p[N][N][4],map[N][N];
int X[4]={0,1,0,-1};
int Y[4]={1,0,-1,0};
int gox[4]={0,1,0,1};
int goy[4]={0,0,1,1};
bool ask(int l,int r){
if(!l||!r||l>=n||r>=m||map[l][r]) return 0;
return 1;
}
bool Dfs(int k){
int x=f[k][0],y=f[k][1],d=f[k][2],t=f[k][3];
if(x==ex&&y==ey) { ans=t-1; return 1; }
for(int i=1;i>=-1;i-=2) {
int D=(d+i)%4;
if(D==-1) D=3;
if(!p[x][y][D]){
p[x][y][D]=t+1;
f[++K][0]=x; f[K][1]=y; f[K][2]=D; f[K][3]=t+1;
}
}
for(int i=1;i<=3;i++){
int l=x+i*X[d];
int r=y+i*Y[d];
if(!ask(l,r)||p[l][r][d]) break;
p[l][r][d]=t+1;
f[++K][0]=l; f[K][1]=r; f[K][2]=d; f[K][3]=t+1;
}
if(k<K) return Dfs(k+1);
return 0;
}
int main(){
freopen("p1126.in","r",stdin);
// freopen("p1126.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&map1[i][j]);
for(int i=1;i<n;i++)
for(int j=1;j<m;j++){
bool yes=1;
for(int k=0;k<4;k++)
if(map1[i+gox[k]][j+goy[k]]) { yes=0; break; }
if(!yes) map[i][j]=1;
}
scanf("%d %d %d %d %c\n",&sx,&sy,&ex,&ey,&F);
switch(F){
case 'E':f[0][2]=0;break;
case 'S':f[0][2]=1;break;
case 'W':f[0][2]=2;break;
case 'N':f[0][2]=3;break;
}
f[0][0]=sx;
f[0][1]=sy;
f[0][3]=1;
p[sx][sy][f[0][2]]=1;
if(Dfs(0)) printf("%d\n",ans); else printf("-1\n");
fclose(stdin);
// fclose(stdout);
return 0;
}