1 条题解

  • 0
    @ 2025-6-18 13:08:55

    题意分析

    机器人有前进,左转,右转三个移动方式,并且可以重复,我们需要检测两个机器人之间是否会碰撞或者会撞墙。

    解题思路

    只需要将机器人的行动方式用函数表达,并且遍历有可能的移动方式即可。

    标程

    #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
    上传者