这道题,恶心了我一下午,历时四个小时,总算是写完了。
恶心之处就在于判断机器人的体积碰撞。
另外初始机器人竟然可能在砖块上??
还有就是,必需是机器人的左上角和终点重合。
AC代码:
#include <bits/stdc++.h>
using namespace std;
void solve();
int main(int argc, char const *argv[])
{
solve();
return 0;
}
/******************************************************************************/
int n,m,sx,sy,ex,ey;
char ch;
int mp[55][55];
bool vis[55][55][5];
struct node{
int x,y;
int step;
int dir;
}p,q;
bool judge(int x,int y){
if(x>0 && x<=n && y>0 && y<=m && mp[x][y] == 0) return 1;
return 0;
}
bool check(int x,int y,int d,int dir){
if(!(judge(x,y) && judge(x+1,y+1) && judge(x+1,y) && judge(x,y+1))) return 0;
if(dir == 0){
switch(d){
case 3: if(!(judge(x-3,y) && judge(x-3,y+1))) return 0;
case 2: if(!(judge(x-2,y) && judge(x-2,y+1))) return 0;
case 1: if(!(judge(x-1,y) && judge(x-1,y+1))) return 0;
}
return 1;
}else if(dir == 1){
switch(d){
case 3: if(!(judge(x,y+4) && judge(x+1,y+4))) return 0;
case 2: if(!(judge(x,y+3) && judge(x+1,y+3))) return 0;
case 1: if(!(judge(x,y+2) && judge(x+1,y+2))) return 0;
}
return 1;
}else if(dir == 2){
switch(d){
case 3: if(!(judge(x+4,y) && judge(x+4,y+1))) return 0;
case 2: if(!(judge(x+3,y) && judge(x+3,y+1))) return 0;
case 1: if(!(judge(x+2,y) && judge(x+2,y+1))) return 0;
}
return 1;
}else if(dir == 3){
switch(d){
case 3: if(!(judge(x,y-3) && judge(x+1,y-3))) return 0;
case 2: if(!(judge(x,y-2) && judge(x+1,y-2))) return 0;
case 1: if(!(judge(x,y-1) && judge(x+1,y-1))) return 0;
}
return 1;
}
return 1;
}
void bfs(){
int x = sx,y= sy;
queue<node> que;
q.x = x;q.y = y;q.step = 0;
if(ch == 'N') q.dir = 0; // ok
if(ch == 'E') q.dir = 1;
if(ch == 'S') q.dir = 2;
if(ch == 'W') q.dir = 3;
que.push(q);
int ans = -1;
while(!que.empty()){
p = que.front();
que.pop();
if(vis[p.x][p.y][p.dir]) continue;
vis[p.x][p.y][p.dir] = 1;
// printf("%d %d %d %d\n",p.x,p.y,p.dir,p.step);
if(p.x == ex && p.y == ey){
ans = p.step;
break;
}
q.step = p.step + 1;
for(int i=1;i<=3;++i){ //Creep or walk or run
if(check(p.x,p.y,i,p.dir)){
if(p.dir == 0){
q.x = p.x - i;
q.y = p.y;
q.dir = p.dir;
que.push(q);
}else if(p.dir == 1){
q.x = p.x;
q.y = p.y + i;
q.dir = p.dir;
que.push(q);
}else if(p.dir == 2){
q.x = p.x + i;
q.y = p.y;
q.dir = p.dir;
que.push(q);
}else if(p.dir == 3){
q.x = p.x;
q.y = p.y - i;
q.dir = p.dir;
que.push(q);
}
}
}
q.x = p.x;q.y = p.y;q.dir = (p.dir-1 + 4)%4;que.push(q);
q.x = p.x;q.y = p.y;q.dir = (p.dir+1 + 4)%4;que.push(q);
}
printf("%d\n",ans);
}
void solve(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j) scanf("%d",&mp[i][j]);
scanf("%d %d %d %d %c",&sx,&sy,&ex,&ey,&ch);
if(mp[ex][ey] == 1) puts("-1");
else if(mp[sx][sy] == 1 || mp[sx+1][sy] == 1 || mp[sx][sy+1] == 1 || mp[sx+1][sy+1] == 1) puts("-1");
else bfs();
}