MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 2632

Posted on 2011-11-07 21:59  MDeath-Kid  阅读(338)  评论(0)    收藏  举报

巨复杂的一个模拟题。

首先给的坐标系统和正常的二维数组下标不一样,需要你颠倒过来,这一来你的方向标就要颠倒。

接着就模拟就行了。

POJ 2632

MDK 2632 Accepted 212K 16MS C++ 3365B 2011-11-07 21:54:51

struct roboot {
int x,y;
char dire;
}R[MAXN];
struct Ans {
int ith;
char dire;
int rep;
}A[MAXN];


int a,b;
int n,m;
int mat[MAXN][MAXN];
int go[4][2]={{0,1},{0,-1},{-1,0},{1,0}};

int getgo(char c) {
if(c == 'N') return 0;
else if(c == 'S') return 1;
else if(c == 'W') return 2;
else return 3;
}

char changeL(char c) {
if(c == 'N') return 'W';
else if(c == 'W') return 'S';
else if(c == 'S') return 'E';
else return 'N';
}

char changeR(char c) {
if(c == 'N') return 'E';
else if(c == 'W') return 'N';
else if(c == 'S') return 'W';
else return 'S';
}

int main () {
FOPEN
int cas;SCF(cas);
while(cas --) {
SCFD(a,b);SCFD(n,m);SET(mat,0);
F(i,b+2) mat[0][i] = -1,mat[a + 1][i] = -1;
F(i,a+2) mat[i][0] = -1,mat[i][b + 1] = -1;
//PP(a+3,b+3,mat);
F(t,n) {
int i = t + 1;
SCFD(R[i].x,R[i].y);
SCFC(R[i].dire);
mat[R[i].x][R[i].y] = i;
//PP(a+3,b+3,mat);
}
F(i,m) {
SCF(A[i].ith);
SCFC(A[i].dire);
SCF(A[i].rep);
}
int flag = 3,r1,r2;
F(i,m) {

if(A[i].dire == 'F') {
mat[R[A[i].ith].x][R[A[i].ith].y] = 0;
int th = getgo(R[A[i].ith].dire);
while(A[i].rep --) {
R[A[i].ith].x += go[th][0];
R[A[i].ith].y += go[th][1];
if(mat[R[A[i].ith].x][R[A[i].ith].y] != 0) {
if(mat[R[A[i].ith].x][R[A[i].ith].y] == -1) {
flag = 1;
r1 = A[i].ith;
} else {
flag = 2;
r1 = A[i].ith;
r2 = mat[R[A[i].ith].x][R[A[i].ith].y];
}
break;
}
}
if(flag != 3) break;
mat[R[A[i].ith].x][R[A[i].ith].y] = A[i].ith;
} else if(A[i].dire == 'L') {
while(A[i].rep --) {
R[A[i].ith].dire = changeL(R[A[i].ith].dire);
}
} else {
while(A[i].rep --) {
R[A[i].ith].dire = changeR(R[A[i].ith].dire);
}
}
//PP(a+3,b+3,mat);
}
if(flag == 3) {
puts("OK");
} else if(flag == 2) {
printf("Robot %d crashes into robot %d\n",r1,r2);
} else {
printf("Robot %d crashes into the wall\n",r1);
}
}
}