1 条题解

  • 0
    @ 2025-4-15 20:17:17

    题意分析

    本题是一个赛车模拟问题,在一个二维网格赛道上模拟赛车的移动。

    • 赛道布局:赛道由不同类型的单元格组成,包括道路(用 x 表示)、非道路但可行驶区域(用 . 表示)、起点/终点线(用 s 表示)和墙壁(用 W 表示)。
    • 赛车移动:赛车初始速度为 0,且有最大速度限制。每一轮赛车会执行一个指令,指令包括继续移动、加速、刹车、左转和右转。赛车按照当前速度和方向移动,移动过程中会经过起始位置和目标位置之间的所有单元格。
    • 特殊情况处理:当赛车进入非道路区域时,下一轮速度会降为 1;当赛车撞到墙壁时,模拟立即停止。
    • 输入输出:输入包含多个场景,每个场景有赛道信息和多辆赛车的初始信息及指令序列。输出每个场景下每辆赛车的最终位置、方向和速度,如果赛车撞墙则输出撞墙位置、方向、速度和 “crashed”,同时记录赛车经过起点/终点线的信息。

    解题思路

    1. 数据读取:读取场景数量,对于每个场景,读取赛道的宽度和高度,以及赛道布局。接着读取要模拟的赛车数量,对于每辆赛车,读取其初始位置、方向、最大速度和指令序列。
    2. 模拟赛车移动:对于每辆赛车,根据指令序列模拟其移动过程。在移动过程中,根据指令更新速度和方向,然后按照当前速度和方向移动,检查经过的单元格类型,处理特殊情况(如进入非道路区域、撞墙)。
    3. 输出结果:如果赛车没有撞墙,输出其最终位置、方向和速度;如果撞墙,输出撞墙位置、方向、速度和 “crashed”。同时输出赛车经过起点/终点线的信息。

    标程

    你提供的代码就是该问题的标程,以下是添加了详细注释的代码:

    #include <iostream>
    #include <vector>
    #include <string>
    
    // 定义8个方向的偏移量(C++98兼容方式)
    const int dx_array[] = {0, 1, 1, 1, 0, -1, -1, -1};
    const int dy_array[] = {-1, -1, 0, 1, 1, 1, 0, -1};
    const std::vector<int> dx(dx_array, dx_array + sizeof(dx_array)/sizeof(dx_array[0]));
    const std::vector<int> dy(dy_array, dy_array + sizeof(dy_array)/sizeof(dy_array[0]));
    
    // 定义赛车结构体
    struct Node {
        int x, y, d, speed, id;
    };
    
    int main() {
        int T;
        std::cin >> T;
    
        int tag = 0;
        while (T--) {
            tag++;
            std::cout << "Scenario #" << tag << ":" << std::endl;
    
            int n, m;
            std::cin >> n >> m;
    
            // 赛道布局
            std::vector<std::string> da(m);
            for (int i = 0; i < m; ++i) {
                std::cin >> da[i];
            }
    
            int tt;
            std::cin >> tt;
    
            while (tt--) {
                int x, y, d, mx;
                std::cin >> x >> y >> d >> mx;
    
                std::string s;
                std::cin >> s;
    
                int speed = 0;
                bool crashed = false;
                int cnt = 0;
                std::vector<Node> p(10010);
    
                for (int i = 0; i < s.length(); ++i) {
                    if (s[i] == 'a') {
                        if (speed < mx) {
                            ++speed;
                        }
                    } else if (s[i] == 'b') {
                        if (speed > 0) {
                            --speed;
                        }
                    } else if (s[i] == 'l') {
                        d = (d + 7) % 8;
                    } else if (s[i] == 'r') {
                        d = (d + 1) % 8;
                    }
    
                    bool flag = false;
                    for (int j = 0; j < speed; ++j) {
                        x += dx[d];
                        y += dy[d];
    
                        if (da[y][x] == 's') {
                            Node temp = {x, y, d, speed, i};
                            p[cnt++] = temp;
                        } else if (da[y][x] == 'W') {
                            crashed = true;
                            std::cout << x << " " << y << " " << d << " " << speed << " crashed" << std::endl;
                            break;
                        } else if (da[y][x] == '.') {
                            flag = true;
                        }
                    }
    
                    if (flag) {
                        speed = 1;
                    }
    
                    if (crashed) {
                        break;
                    }
                }
    
                if (!crashed) {
                    std::cout << x << " " << y << " " << d << " " << speed << std::endl;
                }
    
                for (int i = 0; i < cnt; ++i) {
                    std::cout << "crossing startline: " << p[i].x << " " << p[i].y << " " << p[i].d << " " << p[i].speed << " " << p[i].id << std::endl;
                }
            }
            std::cout << std::endl;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度O(T×C×L)O(T \times C \times L),其中 TT 是场景数量,CC 是每个场景中的赛车数量,LL 是每辆赛车的指令序列长度。
    • 空间复杂度O(W×H+C×L)O(W \times H + C \times L),其中 WWHH 是赛道的宽度和高度,CC 是每个场景中的赛车数量,LL 是每辆赛车的指令序列长度。
    • 1

    信息

    ID
    802
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    1
    上传者