题目:http://poj.org/problem?id=2632
题目大意:在一个棋盘上,几只坦克在上面轮流运动,有三种运动方式,L,R,F,L:向左转90度,t次,R:向右转90度,t次,F:向前走一步,t次。找出第一次发生碰撞的可能性。思路很简单,使用模拟的方法。
代码如下:
#include <stdio.h>
#include <string>
#define ONLINE
void online()
{
#ifdef ONLINE
#else
freopen("2632.in","r", stdin);
freopen("2632.out", "w", stdout);
#endif
}
struct Robot
{
int x;
int y;
int d;
};
struct Instructor
{
int r; //坦克
char o; //指令
int t; // 时间
};
const int N = 0;
const int E= 1;
const int S = 2;
const int W = 3;
const int LEN = 101;
int a, b;
int n, m;
int map[LEN][LEN];
Robot robots[LEN];
int cas;
Instructor ins[LEN];
//打印结果
void print(int r1, int r2)
{
if (r1 == -1 && r2==-1)
{
printf("OK\n");
}
else if (r1 != -1 && r2 == -1)
{
printf("Robot %d crashes into the wall\n", r1);
}
else
printf("Robot %d crashes into robot %d\n", r1, r2);
}
//查找相撞的坦克
int search(int x, int y, int idx)
{
for (int i=1; i <= n; i ++)
{
if (robots[i].x == x && robots[i].y == y&& i != idx)
{
return i;
}
}
return -1;
}
//开始模拟
void imitate()
{
for (int i=0; i < m; i ++)
{
int idx = ins[i].r;
if (ins[i].o == 'L')
{
robots[idx].d = (robots[idx].d + 3 * ins[i].t) % 4;
}
else if (ins[i].o == 'R')
{
robots[idx].d = (robots[idx].d + ins[i].t) % 4;
}
else if (ins[i].o == 'F')
{
for (int j=0; j < ins[i].t; j ++)
{
if (robots[idx].d == N)
{
map[robots[idx].x][robots[idx].y] = 0;
robots[idx].y ++;
if (robots[idx].y > b)
{
print(idx, -1);
return;
}
else if (map[robots[idx].x][robots[idx].y] == 1)
{
int r2 = search(robots[idx].x, robots[idx].y, idx);
print(idx, r2);
return;
}
else
{
map[robots[idx].x][robots[idx].y] = 1;
}//end else
}//end N
else if (robots[idx].d == E)
{
map[robots[idx].x][robots[idx].y] = 0;
robots[idx].x ++;
if (robots[idx].x > a)
{
print(idx, -1);
return;
}
else if (map[robots[idx].x][robots[idx].y] == 1)
{
int r2 = search(robots[idx].x, robots[idx].y, idx);
print(idx, r2);
return;
}
else
{
map[robots[idx].x][robots[idx].y] = 1;
}//end else
}//end E
else if (robots[idx].d == S)
{
map[robots[idx].x][robots[idx].y] = 0;
robots[idx].y --;
if (robots[idx].y <= 0)
{
print(idx, -1);
return;
}
else if (map[robots[idx].x][robots[idx].y] == 1)
{
int r2 = search(robots[idx].x, robots[idx].y, idx);
print(idx, r2);
return;
}
else
{
map[robots[idx].x][robots[idx].y] = 1;
}//end else
}//end S
else if (robots[idx].d == W)
{
map[robots[idx].x][robots[idx].y] = 0;
robots[idx].x --;
if (robots[idx].x <= 0)
{
print(idx, -1);
return;
}
else if (map[robots[idx].x][robots[idx].y] == 1)
{
int r2 = search(robots[idx].x, robots[idx].y, idx);
print(idx, r2);
return;
}
else
{
map[robots[idx].x][robots[idx].y] = 1;
}//end else
}//end W
}
}//end F
}//end for
print(-1, -1);
}
//读入数据
void read()
{
scanf("%d", &cas);
while(cas > 0)
{
scanf("%d%d", &a, &b);
scanf("%d%d", &n, &m);
memset(map,0, LEN * LEN * sizeof(int));
for(int i=1; i <= n; i ++)
{
int x, y;
char c;
scanf( "%d%d %c", &x, &y, &c);
map[x][y] = 1;
robots[i].x = x;
robots[i].y = y;
if (c == 'N')
{
robots[i].d = N;
}
else if (c == 'E')
{
robots[i].d = E;
}
else if (c == 'S')
{
robots[i].d = S;
}
else if (c == 'W')
{
robots[i].d = W;
}
}//end for
for (int i=0; i < m; i ++)
{
scanf("%d %c %d", &ins[i].r, &ins[i].o, &ins[i].t);
}//end for instructor
imitate();
cas --;
}
}
int main()
{
online();
read();
return 0;
}
运行结果如下:
2632 | Accepted | 208K | 0MS | C++ | 3940B | 2011-08-02 13:44:18 |