洛谷:P1563
OJ: I4952
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /**************************************************************** * Description:2016_S_semi_1 玩具谜题 * Author: Alex Li * Date: 2024-09-16 20:07:37 * LastEditTime: 2024-09-16 21:28:52 ****************************************************************/ #include <iostream> #include <vector> #include <string> using namespace std; int main() { int n, m; cin >> n >> m; // 读取玩具小人的数量 n 和指令的数量 m vector<int> facing(n); // 用于存储每个玩具小人的朝向,0 表示面朝圈内,1 表示面朝圈外 vector<string> profession(n); // 用于存储每个玩具小人的职业名称 // 依次读取每个玩具小人的朝向和职业 for (int i = 0; i < n; ++i) { cin >> facing[i] >> profession[i]; } vector<pair<int, int>> instructions(m); // 用于存储所有的指令,每条指令包含 ai 和 Si // 读取 m 条指令 for (int i = 0; i < m; ++i) { int ai, Si; cin >> ai >> Si; instructions[i] = {ai, Si}; } int position = 0; // 初始化当前位置为第一个玩具小人,索引为 0 // 按顺序处理每一条指令 for (int i = 0; i < m; ++i) { int ai = instructions[i].first; // 当前指令的方向,0 表示左数,1 表示右数 int Si = instructions[i].second; // 当前指令要数的人数 int f = facing[position]; // 当前所在玩具小人的朝向 int dir; // 实际移动的方向,0 表示逆时针,1 表示顺时针 // 根据当前玩具小人的朝向和指令的方向,确定实际的移动方向 if (ai == 0) { // 指令为左数 if (f == 0) { // 当前玩具小人面朝圈内 dir = 0; // 实际移动方向为逆时针 } else { // 当前玩具小人面朝圈外 dir = 1; // 实际移动方向为顺时针 } } else { // 指令为右数 if (f == 0) { // 当前玩具小人面朝圈内 dir = 1; // 实际移动方向为顺时针 } else { // 当前玩具小人面朝圈外 dir = 0; // 实际移动方向为逆时针 } } // 根据实际移动方向和人数,更新当前位置 if (dir == 0) { // 逆时针移动 position = (position - Si +n) % n; // 计算新的位置,注意取模防止索引越界 } else { // 顺时针移动 position = (position + Si) % n; // 计算新的位置,取模处理环形结构 } } // 输出最终到达的玩具小人的职业名称 cout << profession[position] << endl; return 0; } |