POJ-2632 Crashing Robots模拟

题目链接:

https://vjudge.net/problem/POJ-2632

题目大意:

在一个a×b的仓库里有n个机器人,编号为1到n。现在给出每一个机器人的坐标和它所面朝的方向,以及m条指令,每条指令由三部分组成:整数num代表该条指令调用的机器人的编号;字符act表示操作:其中L表示原地向左转90°,R表示原地向右转90°,F表示向前走一步;整数rep表示执行该条指令的次数。已知,当两个机器人坐标相同时他们会相撞,某一个机器人走出仓库也会撞到墙,问你能否安全执行这m条指令,如果能则输出“OK”;否则输出中断原因(哪两个机器人相撞,或是哪个机器人撞到墙了)。

思路:

注意细节,直接模拟

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<stack>
 8 #include<map>
 9 using namespace std;
10 typedef long long ll;
11 const int maxn = 1e2 + 10;
12 const int INF = 1 << 30;
13 int dir[4][2] = {1,0,0,1,-1,0,0,-1};
14 int T, n, m;
15 struct node
16 {
17     int x, y, dir;
18 };
19 node a[maxn];
20 map<char, int>M;
21 int Map[200][200];
22 int main()
23 {
24     cin >> T;
25     int c1, c2;
26     M['E'] = 0;
27     M['N'] = 1;
28     M['W'] = 2;
29     M['S'] = 3;
30     while(T--)
31     {
32         cin >> n >> m;
33         cin >> c1 >> c2;
34         char c;
35         memset(Map, 0, sizeof(Map));
36         memset(a, 0, sizeof(a));
37         for(int i = 1; i <= c1; i++)
38         {
39             cin >> a[i].x >> a[i].y >> c;
40             a[i].dir = M[c];
41             Map[a[i].x][a[i].y] = i;
42         }
43         int flag = 0, ansid1, ansid2;
44         for(int i = 1; i <= c2; i++)
45         {
46             int id, tot;
47             cin >> id >> c >> tot;
48             if(flag)continue;
49             if(c == 'L')
50             {
51                 a[id].dir += tot;
52                 a[id].dir %= 4;
53             }
54             else if(c == 'R')
55             {
56                 a[id].dir -= tot;
57                 a[id].dir = ((a[id].dir % 4) + 4) % 4;
58             }
59             else if(c == 'F')
60             {
61                 Map[a[id].x][a[id].y] = 0;
62                 for(int i = 1; i <= tot; i++)
63                 {
64                     //cout<<a[id].x<<" "<<a[id].y<<" "<<a[id].dir<<endl;
65                     a[id].x += dir[a[id].dir][0];
66                     a[id].y += dir[a[id].dir][1];
67 
68                     if(a[id].x <= 0 || a[id].x > n || a[id].y <= 0 || a[id].y > m)
69                     {
70                         flag = 1;
71                         ansid1 = id;
72                         break;
73                     }
74                     else if(Map[a[id].x][a[id].y])
75                     {
76                         flag = 2;
77                         ansid1 = id;
78                         ansid2 = Map[a[id].x][a[id].y];
79                     }
80                     if(flag)break;
81                 }
82                 Map[a[id].x][a[id].y] = id;
83             }
84         }
85         if(!flag)cout<<"OK"<<endl;
86         else if(flag == 1)
87             cout<<"Robot "<<ansid1<<" crashes into the wall"<<endl;
88         else cout<<"Robot "<<ansid1<<" crashes into robot "<<ansid2<<endl;
89     }
90     return 0;
91 }

 

posted @ 2018-04-04 18:42  _努力努力再努力x  阅读(106)  评论(0编辑  收藏  举报