1 条题解
-
0
题意分析
机器人有前进,左转,右转三个移动方式,并且可以重复,我们需要检测两个机器人之间是否会碰撞或者会撞墙。
解题思路
只需要将机器人的行动方式用函数表达,并且遍历有可能的移动方式即可。
标程
#include <iostream> #include <vector> using namespace std; // 左转函数 char left_turn(char c) { switch(c) { case 'N': return 'W'; case 'W': return 'S'; case 'S': return 'E'; case 'E': return 'N'; } return c; } // 右转函数 char right_turn(char c) { switch(c) { case 'N': return 'E'; case 'E': return 'S'; case 'S': return 'W'; case 'W': return 'N'; } return c; } int main() { int K; cin >> K; // 测试用例数量 while (K--) { int A, B; cin >> A >> B; // 仓库尺寸 int N, M; cin >> N >> M; // 机器人数量和指令数量 // 定义机器人结构体:位置(x,y)和朝向(dir) struct Robot { int x, y; char dir; }; vector<Robot> robots(N); // 读取每个机器人的初始状态 for (int i = 0; i < N; i++) { cin >> robots[i].x >> robots[i].y >> robots[i].dir; } bool crash = false; // 标记是否发生碰撞 // 处理每条指令 for (int i = 0; i < M; i++) { int robot_id; char action; int repeat; cin >> robot_id >> action >> repeat; // 如果已经发生碰撞,跳过后续指令处理 if (crash) { continue; } int idx = robot_id - 1; // 机器人索引(0-based) if (action == 'L') { // 左转repeat次 for (int j = 0; j < repeat; j++) { robots[idx].dir = left_turn(robots[idx].dir); } } else if (action == 'R') { // 右转repeat次 for (int j = 0; j < repeat; j++) { robots[idx].dir = right_turn(robots[idx].dir); } } else if (action == 'F') { // 前进repeat步 for (int step = 0; step < repeat; step++) { int nx = robots[idx].x; int ny = robots[idx].y; // 根据朝向计算下一步位置 switch (robots[idx].dir) { case 'N': ny++; break; case 'S': ny--; break; case 'E': nx++; break; case 'W': nx--; break; } // 检查是否撞墙 if (nx < 1 || nx > A || ny < 1 || ny > B) { cout << "Robot " << robot_id << " crashes into the wall" << endl; crash = true; break; // 跳出当前前进循环 } // 检查是否与其他机器人碰撞 bool collide = false; int crash_robot_id = -1; for (int j = 0; j < N; j++) { if (j == idx) continue; // 跳过自己 if (robots[j].x == nx && robots[j].y == ny) { collide = true; crash_robot_id = j; break; } } if (collide) { cout << "Robot " << robot_id << " crashes into robot " << crash_robot_id + 1 << endl; crash = true; break; // 跳出当前前进循环 } // 更新机器人位置 robots[idx].x = nx; robots[idx].y = ny; } } } // 如果所有指令执行完毕都没有碰撞 if (!crash) { cout << "OK" << endl; } } return 0; }
- 1
信息
- ID
- 1632
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者