1 条题解
-
0
一、问题核心
蛇梯棋游戏中,玩家轮流投掷骰子移动棋子。棋盘上有梯子(连接低编号方格到高编号方格)和蛇梯(连接高编号方格到低编号方格),棋子落在梯子或蛇梯起始方格时会移动到对应结束方格。还有特殊方格,落在上面时玩家可能错过回合或立即再次投掷骰子。玩家棋子从 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
- 上传者