您的位置:首页 > 编程语言 > Go语言

POJ 2632: Crashing Robots 哎呀!撞了!

2014-02-25 18:53 393 查看
原题链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm ACM poj 模拟