您的位置:首页 > 其它

POJ-2632 Crashing Robots 模拟

2012-06-29 20:32 417 查看
该题是个纯模拟题,只要仔细模拟就可以了,刚开始的时候自己按照自己的想法把行列关系进行了更改,结果弄得方向错乱。该证后AC。

代码如下:

#include <cstring>
#include <cstdio>
#include <cstdlib>
#define MAXN 105
using namespace std;

int A, B, N, M, x[MAXN], y[MAXN], d[MAXN];
int G[MAXN][MAXN];
int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
char box[MAXN]; // 接受信息

struct Message
{
int No, times;
char op[3];
}m;

bool update(int &who, int &kind)
{
if (m.op[0] == 'L') { // 左转
d[m.No] = (d[m.No] - m.times + 120) % 4;
}
else if (m.op[0] == 'R') {  // 右转
d[m.No] = (d[m.No] + m.times) % 4;
}
else {  // 前进
while (m.times--) {
G[x[m.No]][y[m.No]] = 0;
int xx = (x[m.No] += dir[ d[m.No] ][0]);
int yy = (y[m.No] += dir[ d[m.No] ][1]);
if (xx < 1 || xx > A || yy < 1 || yy > B) {
kind = 1;
return true;
}
else if (G[xx][yy] != 0) {
kind = 2;
who = G[xx][yy];
return true;
}
else {
G[xx][yy] = m.No;
}
}
}
return false;
}

int main()
{
int T;
bool over;
char temp[3];
scanf("%d", &T);
while (T--) {
memset(G, 0, sizeof (G));
box[0] = 'O', box[1] = 'K', box[2] = '\0';
over = false;
scanf("%d %d", &A, &B); // A 为宽,B为高
scanf("%d %d", &N, &M); // N 为机器人的个数, M为指令的条数
for (int i = 1; i <= N; ++i) {
scanf("%d %d %s", &x[i], &y[i], temp);
G[x[i]][y[i]] = i;
switch (temp[0]) {
case 'W': d[i] = 0; break;
case 'N': d[i] = 1; break;
case 'E': d[i] = 2; break;
case 'S': d[i] = 3; break;
}
}
while (M--) {
int who, kind;
scanf("%d %s %d", &m.No, m.op, &m.times);
if (over) {
continue;
}
if (update(who, kind)) {
over = true;
if (kind == 1) {
sprintf(box, "Robot %d crashes into the wall", m.No);
}
else {
sprintf(box, "Robot %d crashes into robot %d", m.No, who);
}
}
}
puts(box);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: