1 条题解

  • 0
    @ 2025-5-13 12:13:57

    一、问题核心

    蛇梯棋游戏中,玩家轮流投掷骰子移动棋子。棋盘上有梯子(连接低编号方格到高编号方格)和蛇梯(连接高编号方格到低编号方格),棋子落在梯子或蛇梯起始方格时会移动到对应结束方格。还有特殊方格,落在上面时玩家可能错过回合或立即再次投掷骰子。玩家棋子从 0 方格开始,第一个到达 100 方格的玩家获胜。输入包括骰子投掷序列、玩家数量、棋盘上梯子和蛇梯的定义以及特殊方格的信息,输出为每个游戏的获胜玩家编号。

    二、关键思路

    (一)数据读取与初始化

    读取骰子投掷序列,将其存储为整数列表。 对于每个游戏组: 读取玩家数量,初始化每个玩家的棋子位置为 0。 读取梯子和蛇梯的信息,使用字典存储,键为起始方格,值为结束方格。 读取特殊方格的信息,使用字典存储,键为方格编号,值为 “lose_turn” 或 “extra_turn”。

    (二)游戏模拟过程

    对于每个玩家的回合: 从骰子投掷序列中获取当前的骰子点数,移动玩家的棋子。 判断棋子移动后是否超过 100,若超过则忽略本次投掷,继续下一个玩家的回合。 检查棋子是否落在梯子或蛇梯的起始方格上,如果是,则将棋子移动到对应的结束方格。 检查棋子是否落在特殊方格上: 如果是 “lose_turn” 类型的特殊方格,则跳过该玩家的下一个回合。 如果是 “extra_turn” 类型的特殊方格,则再次从骰子投掷序列中获取点数并移动棋子。 判断棋子是否到达 100 方格,如果是,则该玩家获胜,输出该玩家的编号,并结束当前游戏。

    (三)多个游戏组处理

    重复上述游戏模拟过程,处理输入中的多个游戏组。 每个游戏组结束后,重置玩家的位置和相关数据,准备处理下一个游戏组。

    代码实现

    #include <iostream>
    #include <cstring>
    using namespace std;
     
    int main()
    {
        int step[100], map[101], turn[7], cur[7];
        int step_num, i, peo, sx, ex, again, ans, j;
        memset(step, 0, sizeof(step));
        i = 0;
        while (cin >> step[i])
        {
            if (step[i] == 0)
                break;
            i++;
        }
        step_num = i - 1;
        while(cin >> peo)
        {
            if (peo == 0)
                break;
            memset(map, 0, sizeof(map));
            while (cin >> sx >> ex)
            {
                if (sx == 0 && ex == 0)
                    break;
                else map[sx] = ex;
            }
            while (cin >> again)
            {
                if (again == 0)
                    break;
                else if (again > 0)
                    map[again] = -1;//重新扔一次
                else map[-again] = -2;//下次不扔
            }
            memset(turn, 0, sizeof(turn));//为0表示不turn
            memset(cur, 0, sizeof(cur));
            for (i = 0, ans = 0; i <= step_num; i++)
            {
                if (!turn[ans])
                {
                    j = cur[ans] + step[i];
                    if (j == 100)
                        break;
                    if (j > 100)
                    {
                        ans = (ans + 1) % peo;
                        continue;
                    }
                    if (map[j] == 0)
                    {
                        cur[ans] = j;
                        ans = (ans + 1) % peo;
                        continue;
                    }
                    if (map[j] > 0)
                    {
                        cur[ans] = map[j];
                        ans = (ans + 1) % peo;
                        continue;
                    }
                    if (map[j] == -1)
                    {
                        cur[ans] = j;
                        continue;
                    }
                    if (map[j] == -2)
                    {
                        cur[ans] = j;
                        turn[ans] = 1;
    //                    continue;
                    }
                }
                else
                    turn[ans] = 0;
                ans = (ans + 1) % peo;
            }
            cout << ans + 1 << endl;
        }
        return 0;
    }
    
    
    • 1

    信息

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