复赛一:玩具谜题

洛谷: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;
}
Scroll to Top