1 条题解
-
0
题目大意
- 有一个 ( N \times M ) 的棋盘,部分格子有障碍物。
- 有 ( K ) 枚棋子,分属红队和蓝队,每枚棋子有位置、属性 ( (a_i, b_i) )、方向、技能、复活时间等属性。
- 游戏进行 ( R ) 个回合,每个回合按顺序执行:
- 移动阶段:所有能动的棋子按当前方向移动一格,若不能移动则转向 180 度。
- 技能阶段:按编号从小到大依次释放技能(如果技能可用)。
- 交战阶段:同一格内的红蓝棋子按规则战斗,可能阵亡,之后会在若干回合后复活。
技能种类与效果
题目给出了 10 种技能,每种技能有不同的效果,例如:
- 重锤火花:无效果。
- 面子之王:所有棋子方向永久左转 90 度。
- 头发掉光:临时增加属性,持续若干回合后恢复。
- 拉比哩比:扇形范围击退,考虑障碍物阻挡。
- 退学花火:使上一个释放重锤火花的棋子无法移动若干回合。
- 救乌干达:复活己方或对方阵亡棋子。
- 降维打击:发射光波,遇障碍或边界转向,爆炸后使范围内棋子无法释放技能。
- 咕咕咕咕:己方未释放技能的棋子本回合不能释放。
- 反向传播:自身状态回到若干回合前(位置、属性、存活状态等)。
- 葱之礼赞:计算红蓝棋子最大可配对数(条件:不同阵营且 ( a_i \oplus a_j ) 是 3 的倍数)。
解题思路
1. 数据存储
- 用二维数组表示棋盘(记录障碍物)。
- 用结构体/类数组存储每个棋子的所有状态:位置、属性、方向、阵营、技能类型、技能参数、技能冷却、复活倒计时、是否存活、身上的持续效果等。
2. 回合模拟
对每个回合 ( H = 1 \dots R ):
(1)移动阶段
- 遍历每个存活的棋子,尝试沿当前方向移动一格。
- 如果目标位置是障碍物或出界,则转向 180 度(不移动)。
(2)技能阶段
- 按编号顺序检查每个存活棋子是否满足释放技能的条件(冷却结束)。
- 根据技能种类执行效果,注意某些技能会影响其他棋子的状态或位置。
- 特别要注意技能 10(葱之礼赞) 在释放时要输出一个整数(最大匹配数)。
(3)交战阶段
- 检查每个格子,如果同时有红蓝棋子,则进行战斗:
- 每次双方派出当前格子内战力(组合数 ( C_{a_i}^{b_i} ))最大的棋子。
- 战力高的获胜,败者阵亡,胜者属性减少。
- 重复直到一方全灭。
- 阵亡的棋子在 ( r_i ) 回合后复活,复活时重置属性、清除技能效果,位置不变(?这里注意规则,复活时位置是初始位置还是死亡位置?题目说“位置及方向”在反向传播技能中会回到过去,但复活时只说属性变回初始,方向保持阵亡前方向,没说位置,推测复活在当前位置复活,但需确认规则)。
注意事项
- 技能效果叠加与消失:例如技能 3(头发掉光)的效果会叠加,消失时按规则扣除属性。
- 击退与边界:技能 4 的击退会穿墙/循环地图,直到走到非障碍非边界的位置。
- 光波路径模拟:技能 7 需要模拟光波移动,每次碰到障碍或边界就顺时针转 90 度,直到达到指定距离后爆炸。
- 状态回退:技能 9(反向传播)只影响自身,且技能冷却时间不回退。
- 时间持续效果:所有持续效果在指定回合开始的时候消失。
输出
- 游戏过程中,当有棋子释放葱之礼赞时,立即输出一行最大匹配数。
- 全部 ( R ) 回合结束后,按棋子编号输出每个棋子的最终位置(行 列)。
总结
这道题是一个大模拟,考察的是对复杂规则的代码实现能力和细节处理。
解题时需要:- 仔细阅读规则,理解每个技能的效果和影响范围。
- 合理设计数据结构,存储棋子状态和棋盘信息。
- 按阶段分步模拟,注意执行顺序和相互影响。
- 充分测试边界情况,如技能同时触发、复活与技能的关系等。
由于规则非常复杂,建议先实现基本框架,再逐个技能添加功能,并通过样例验证。
- 1
信息
- ID
- 5046
- 时间
- 10000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者