题目链接:
http://poj.org/problem?id=2632
题目描述:
有一个B*A的厂库,分布了n个机器人,机器人编号1~n。我们知道刚开始时全部机器人的位置和朝向,我们可以按顺序操控机器人,没有两个机器人可以同时执行命令。如果机器人走到厂库边界,他将碰到墙,如果两个机器人走到同一位置,则表示他们两个相撞。问m个命令内最先发生的碰撞,如果没有碰撞输出“OK”。
解题思路:
由图可知,本题的矩阵与平时的不太一样,所以我们在对厂库进行操作的时候,可以先把厂库顺时针旋转90°,当然,方向也要跟着旋转90°。左右方向是不会跟着变的。然后老老实实的按照命令去模拟,就大功告成啦。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <iostream> 5 using namespace std; 6 7 #define maxn 105 8 9 struct node 10 { 11 int x, y, s; 12 } stu[maxn];//每个机器人的位置(x,y),和方向s 13 14 int dir[4][2] = {-1,0, 0,1, 1,0, 0,-1};//翻转后的四个方向:W,N,E,S 15 int map[maxn][maxn]; 16 17 int main() 18 { 19 int t, A, B, n, m, i, j, flag, x, y, num1, num2; 20 char ch[2]; 21 22 scanf ("%d", &t); 23 while (t --) 24 { 25 flag = 0;//是否发生碰撞 26 scanf ("%d %d", &A, &B); 27 scanf ("%d %d", &n, &m); 28 memset (map, 0, sizeof(map)); 29 for (i=1; i<=n; i++) 30 { 31 scanf ("%d %d %s", &stu[i].x, &stu[i].y, ch); 32 if (ch[0] == 'W') 33 stu[i].s = 0; 34 else if (ch[0] == 'N') 35 stu[i].s = 1; 36 else if (ch[0] == 'E') 37 stu[i].s = 2; 38 else 39 stu[i].s = 3; 40 map[stu[i].x][stu[i].y] = i; 41 } 42 43 while (m --) 44 { 45 scanf ("%d%s%d", &x, ch, &y); 46 if (flag) 47 continue; 48 if (ch[0] == 'L')//对机器人进行转弯 49 { 50 stu[x].s -= y % 4;//这里有可能是负数,会导致下面运行re,必须要处理 51 stu[x].s = (stu[x].s + 4) % 4; 52 } 53 else if (ch[0] == 'R') 54 } 55 stu[x].s += y; 56 stu[x].s = (stu[x].s + 4) % 4; 57 } 58 else 59 { 60 map[stu[x].x][stu[x].y] = 0; 61 while (y --)//一定要对沿途经过的地方进行判断,是否会有碰撞发生 62 { 63 stu[x].x = stu[x].x + dir[stu[x].s][0]; 64 stu[x].y = stu[x].y + dir[stu[x].s][1]; 65 if (stu[x].x<=0 || stu[x].x>A || stu[x].y<=0 || stu[x].y>B)//是否碰撞到墙 66 { 67 num1 = x; 68 flag = 1; 69 break; 70 } 71 else if (map[stu[x].x][stu[x].y])//是否碰撞到别的机器人 72 { 73 num1 = x; 74 num2 = map[stu[x].x][stu[x].y]; 75 flag = 2; 76 break; 77 } 78 } 79 map[stu[x].x][stu[x].y] = x; 80 } 81 } 82 if (! flag) 83 printf ("OK "); 84 else if (flag == 1) 85 printf ("Robot %d crashes into the wall ", num1); 86 else 87 printf ("Robot %d crashes into robot %d ", num1, num2); 88 } 89 return 0; 90 }