poj 2632 Crashing Robots 模拟

题目链接:

  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 }

  

本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/alihenaixiao/p/4176378.html