原题链接:Crashing Robots
题目大意:给定房间大小和一些机器人的坐标,看机器人在给定的一系列动作下是否会撞墙或撞上其他机器人。
大致思路:模拟,关键是方向之间的转换,设其中一个方向比如W为0,则按逆时针方向 S为1、E为2、N为3;另外还要考虑到前进时坐标的变换,所以可以定义一个二维数组。具体代码实现如下:
#include <cstdio>
#include <cstring>
int vec[4][2] = {{0,1},{-1,0},{0,-1},{1,0}};
int x[10005];
int y[10005];
int dir[10005];
int grid[105][105];
int breadth, depth;
int toDir(char ch) {
if(ch=='N') return 0;
if(ch=='W') return 1;
if(ch=='S') return 2;
if(ch=='E') return 3;
return -1;
}
bool move(int order, int repeat) {
grid[x[order]][y[order]] = 0;
for(int j=0; j<repeat; j++) {
x[order] += vec[dir[order]][0];
y[order] += vec[dir[order]][1];
if(grid[x[order]][y[order]]!=0) {
printf("Robot %d crashes into robot %d\n", order, grid[x[order]][y[order]]);
return false;
}
if(x[order]>breadth || x[order]<1 || y[order]<1 || y[order]>depth) {
printf("Robot %d crashes into the wall\n", order);
return false;
}
}
grid[x[order]][y[order]] = order;
return true;
}
int main() {
int N, rnum, inum, i, order, repeat, flag;
char ch, action;
scanf("%d", &N);
while(N--) {
memset(grid, 0, sizeof(grid));
scanf("%d%d", &breadth, &depth);
scanf("%d%d", &rnum, &inum);
for(i=1; i<=rnum; i++) {
scanf("%d %d %c", &x[i], &y[i], &ch);
dir[i] = toDir(ch);
grid[x[i]][y[i]] = i;
}
flag = 1;
for(i=1; i<=inum; i++) {
scanf("%d %c %d", &order, &action, &repeat);
if(flag) {
if(action == 'L') {
dir[order] += repeat%4;
dir[order] = dir[order]%4;
}
else if(action == 'R') {
dir[order] -= repeat%4;
dir[order] = (dir[order]+4)%4;
}
else {
if(!move(order, repeat)) flag = 0;
}
}
}
if(flag) printf("OK\n");
}
return 0;
}