1 条题解
-
0
题意分析
本题是一个赛车模拟问题,在一个二维网格赛道上模拟赛车的移动。
- 赛道布局:赛道由不同类型的单元格组成,包括道路(用
x
表示)、非道路但可行驶区域(用.
表示)、起点/终点线(用s
表示)和墙壁(用W
表示)。 - 赛车移动:赛车初始速度为 0,且有最大速度限制。每一轮赛车会执行一个指令,指令包括继续移动、加速、刹车、左转和右转。赛车按照当前速度和方向移动,移动过程中会经过起始位置和目标位置之间的所有单元格。
- 特殊情况处理:当赛车进入非道路区域时,下一轮速度会降为 1;当赛车撞到墙壁时,模拟立即停止。
- 输入输出:输入包含多个场景,每个场景有赛道信息和多辆赛车的初始信息及指令序列。输出每个场景下每辆赛车的最终位置、方向和速度,如果赛车撞墙则输出撞墙位置、方向、速度和 “crashed”,同时记录赛车经过起点/终点线的信息。
解题思路
- 数据读取:读取场景数量,对于每个场景,读取赛道的宽度和高度,以及赛道布局。接着读取要模拟的赛车数量,对于每辆赛车,读取其初始位置、方向、最大速度和指令序列。
- 模拟赛车移动:对于每辆赛车,根据指令序列模拟其移动过程。在移动过程中,根据指令更新速度和方向,然后按照当前速度和方向移动,检查经过的单元格类型,处理特殊情况(如进入非道路区域、撞墙)。
- 输出结果:如果赛车没有撞墙,输出其最终位置、方向和速度;如果撞墙,输出撞墙位置、方向、速度和 “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; }
复杂度分析
- 时间复杂度:,其中 是场景数量, 是每个场景中的赛车数量, 是每辆赛车的指令序列长度。
- 空间复杂度:,其中 和 是赛道的宽度和高度, 是每个场景中的赛车数量, 是每辆赛车的指令序列长度。
- 赛道布局:赛道由不同类型的单元格组成,包括道路(用
- 1
信息
- ID
- 802
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者