//题意:题意很简单给一个坐标图,k代表样例个数,b,a代表举行长宽,n,m代表机器人数,指令数,n个表示机器人初始位置,m条指令,m条指令中F:直行,L:向左转(注意只是改变朝向,坐标不变)R:向右转(改变朝向,坐标不变)输出有三种情况:1.机器人可能走出这个表格撞墙;2.机器人撞到另一个机器人这两种情况;【注意:按照给的坐标的顺序就是机器人的编号】3.OK;是哪种情况就输出那种情况。【思路很简单,一定写的时候理清思路,做好注释,第一次写完运行时总是codeblocks弹窗闪退,改了半天自认为思路没问题但总是这样,恰逢poj服务器爆炸,就扔了一周左右回来改代码 ,最后发现本应该在样例全部输入完毕在输出,但我每次碰到,撞墙或者撞机器人后我直接break输出,导致命令并没有输入完,将break后的吓一条命令给了下一组a,b闪退,哇心态爆炸,看到的同学一定注意别被自己蠢死】
//思路:1.确定初始位置和朝向,并记录这两种属性(后面存在机器人互相撞的情况)【注意这里有坐标系变换的】;2.判断下一步操作然后先判断是否越界或者相撞,若发生以上情况则记录;3.更新记录;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
struct{
int x, y;
char turn;
}add_rob[120];
int xx, yy;
int vis[120][120];
void dirc(int rob_id)//一定注意数组下标与数轴的转化
{
if(add_rob[rob_id].turn == 'E'){
xx = add_rob[rob_id].x + 0;
yy = add_rob[rob_id].y + 1;
}else if(add_rob[rob_id].turn == 'S'){
xx = add_rob[rob_id].x + 1;
yy = add_rob[rob_id].y + 0;
}else if(add_rob[rob_id].turn == 'W'){
xx = add_rob[rob_id].x + 0;
yy = add_rob[rob_id].y - 1;
}else if(add_rob[rob_id].turn == 'N'){
xx = add_rob[rob_id].x - 1;
yy = add_rob[rob_id].y + 0;
}
return ;
}
void now_turn(int rob_id, int up_turn)
{
if(add_rob[rob_id].turn == 'E'){
if(up_turn == 'L'){
add_rob[rob_id].turn = 'N';
}else if(up_turn == 'R'){
add_rob[rob_id].turn = 'S';
}
}else if(add_rob[rob_id].turn == 'S'){
if(up_turn == 'L'){
add_rob[rob_id].turn = 'E';
}else if(up_turn == 'R'){
add_rob[rob_id].turn = 'W';
}
}else if(add_rob[rob_id].turn == 'W'){
if(up_turn == 'L'){
add_rob[rob_id].turn = 'S';
}else if(up_turn == 'R'){
add_rob[rob_id].turn = 'N';
}
}else if(add_rob[rob_id].turn == 'N'){
if(up_turn == 'L'){
add_rob[rob_id].turn = 'W';
}else if(up_turn == 'R'){
add_rob[rob_id].turn = 'E';
}
}
return ;
}
int main()
{
int t;
scanf("%d", &t);
while(t--){
//初始化
int a, b; //长宽
int n_rob, m_ins; //机器人数量 命令数量
char getchar_; //当前朝向 更新的方向(默认直走) 读掉空字符
memset(vis, 0, sizeof(vis)); //机器人到某个坐标 当前坐标为占用其他坐标释放
scanf("%d%d%d%d", &a, &b, &n_rob, &m_ins);
for(int i = 1; i <= n_rob; i++){
int dx, dy;
scanf("%d%d%c%c", &dx, &dy, &getchar_, &add_rob[i].turn);
add_rob[i].x = b + 1 - dy;
add_rob[i].y = dx;
vis[add_rob[i].x][add_rob[i].y] = i;
}
//每条命令执行情况
int id, cnt, indx, indy; //机器人id 每条命令执行次数 要跟新的方向 没发生事故的横纵坐标
char turn_update;
int end_id, end_xx, end_yy, isend = 0;
for(int i = 0; i < m_ins; i++){
scanf("%d%c%c%d", &id, &getchar_, &turn_update, &cnt);
if(isend != 0)
continue;
while(cnt--){
if(turn_update != 'F'){
now_turn(id, turn_update);
}else{
dirc(id);
if(xx > b || yy > a || xx < 1 || yy < 1){
isend = 1;
end_id = id;
break;
}else if(vis[xx][yy] != 0){
isend = 2;
end_id = id;
end_xx = xx;
end_yy = yy;
break;
}
//更新记录
vis[add_rob[id].x][add_rob[id].y] = 0;
add_rob[id].x = xx;
add_rob[id].y = yy;
vis[xx][yy] = id;
}
}
}
if(isend == 1){
printf("Robot %d crashes into the wall\n", end_id);
}else if(isend == 2){
printf("Robot %d crashes into robot %d\n", end_id, vis[end_xx][end_yy]);
}else{
printf("OK\n");
}
}
return 0;
}