秋招日记之——网易雷火笔试题目
注:此文仅记录README.md的题目描述
牛客网 AI Coding 题目 - 逆水寒 · 天机迷踪
AI Coding 做题说明
【关于题目】 请根据本文档的题目描述,完成题目要求的相关功能开发实现。
【关于分数】 本题采用测试用例与对话过程综合评分方式。() 题目具有一定挑战性,最终测试用例得分并不等同于本题最终成绩,评分将综合考察考生与 AI 助手的任务分析、方案迭代和协作解决过程中的表现。
【提交内容】 正式评测读取
solution.cpp中的策略实现;index.html面板样式和调试日志仅用于预览,不属于提交实现。【测试样例】 题包提供的测试样例可通过页面上方的「试运行样例」按钮执行,也可在超胆命令行手动运行;公开样例仅用于自测,不代表最终得分。
【系统使用提示】 可通过左下方「时间线」入口查看不同时间节点的代码 diff。
【AI 使用提示】 请使用页面中的测试或预览入口验证当前实现,并将关键报错、状态变更或输出结果反馈给 AI 助手继续分析和校验。
【AI 使用提示】 当前 AI 助手不支持直接执行终端命令;当 AI 陷入僵局无法自我纠错时,重新启动一次新的对话也可能是更好的尝试。
【网络异常处理】 全部文件编辑会自动实时同步到服务器。() 若遇到无法保存、预览未更新或 AI 助手无响应,请检查网络,并尝试刷新页面加载。
平台说明
本题固定使用 C++,请在 solution.cpp 中实现你的策略程序,判题器会编译并运行你的程序,通过标准输入/输出与程序交互。
index.html 会读取工作区中的 replay.json 并展示可视化回放。该文件由下方预置脚本生成,正式判分不会依赖或生成它。
如需在提交前查看当前策略的回放,可在终端运行:
python generate_replay.py
该脚本只用于生成 index.html 读取的 replay.json,不参与正式得分。正式提交时,判题系统会直接编译并运行你的 solution.cpp,不会读取或要求你提交 replay.json。
你可以编辑 preview_cases/preview.case 来调整本地预览场景,观察不同灾害序列下的策略效果。preview_judge.py 只服务于本地可视化预览,修改它不会影响正式判分。
平台操作补充
右侧 AI 对话可以展开对话,也可以回到历史对话推演查看之前的分析和代码修改记录。
修改
solution.cpp后,如果想刷新左侧 HTML 回放,需要在终端执行python generate_replay.py,脚本会重新生成replay.json;只改代码而不执行脚本,页面仍会显示上一次回放。在当前笔试环境中,生成新的
replay.json后,还需要回到index.html预览页并点击右上角的“运行”按钮(或刷新预览页)重新加载回放。未来迁移到 C 端或其他自动刷新环境,可能不需要这一步。每次点击“试运行样例”或“提交判分”后,判分面板右侧会展示一段 JSON 结果,除总分外,建议展开查看其中的
feedback、debugInfo、groups、caseResults等字段,这些字段包含格式错误、超时、扣分原因或策略表现说明,有助于定位问题。如果一次修改后效果变差,可以使用编辑器自带的历史记录、撤销或文件版本回退能力,将
solution.cpp恢复到之前较好的版本,也可以让右侧 AI 根据上一版代码重新生成。回退后需要重新“试运行样例”或“提交判分”确认效果。index.html只负责读取当前工作区的replay.json版本做可视化预览,正式提交不会读取该文件。正式判分以提交时的
solution.cpp作为唯一文本,预览脚本和preview_cases/preview.case只用于本地调试,不影响隐藏用例成绩。
题目背景
天机阁首席天机弟子窥见天象——七日之内灾厄降临将毁灭天灾浩劫。阁主命你率领一支 NPC 小队护送天机弟子穿越灾区,将天机密卷送达前线。
然而途中天象异变,妖兽横生——暴雨、天雷、地震、烈火接踵而至。每一轮天机显现时,你会在行动前获得本回合即将结算事件的完整信息(事件类型与精确参数),你需要据此立刻做出决策。
小队成员各有专长:铁衣卫能保护队友,影舞者能探索远方,药王弟子能治疗,神相能以屏障御敌。但天机弟子是护送核心——他若阵亡,天灾蔓延,整局任务失败,得分归零。
你的目标:在全部灾劫结束后,护送天机弟子存活,并尽可能让更多队员活下来。
一、游戏世界
1.1 地图
地图是一个 $W \times H$ 的网格(所有坐标为 0-indexed,左上角为 (0, 0),x 向右增大为列,y 向下增大为行),每个格子有一个地形类型。地形对不同事件有复杂交互,以下为完整规则(亦可见附录速查表):
| 数值 | 地形 | 完整规则 |
|---|---|---|
0 |
平地 | 可通行,无特殊效果 |
1 |
山崖 | 不可通行。天雷命中时溅射(S1 范围各 1 点);地震时近座 NPC 受落石 $+1$ |
2 |
河流 | 可通行,MONSTER / RAINSTORM **伤害 **$+1$;HEAL **恢复 **$+1$。EARTHQUAKE / WILDFIRE 完全免疫 |
3 |
密林 | 可通行。WILDFIRE 伤害减半(2->1)。LIGHTNING 命中时变为范围溅射($\le 1$ 范围各 1 点,非致命)。DATANROOM 伤害减半(1->0)。MONSTER 无特殊效果(1点) |
地图坐标系:左上角为 (0, 0),x 向右增大,y 向下增大。
距离度量:本题目中所有距离均使用曼哈顿距离($\vert{}x1 - x2\vert{} + \vert{}y1 - y2\vert{}$)。所有“圆形区域”均指曼哈顿圆(即边界为菱形的区域,区域内所有格子满足曼哈顿距离 $\le$ 半径),“相邻”指曼哈顿距离 $= 1$(即上下左右 4 格)。
1.2 NPC 类型与属性
小队由多种职业的 NPC 组成。天机弟子 id 固定为 1,其他 id 按初始化输入顺序排列。
| 职业 | HP | 速度 | 特殊能力 |
|---|---|---|---|
| 天机弟子 | 1 | 1 | 护送目标。死亡 $\rightarrow$ 本局总分 归零 |
| 铁衣卫 | 5 | 1 | 护卫(被动):每回合 1 次,相邻队友受到事件伤害时,铁衣卫代受 1 点 |
| 影舞者 | 2 | 3 | 侦察:存活时,每回合开始前提供下回合所有事件相对天机弟子的方向预警(WARNING 行) |
| 药王弟子 | 3 | 2 | 治疗(主动,消耗 0 AP):治疗相邻 1 名存活队友 1 点 HP,消耗 0 AP。使用后下 3 个回合不可再次使用(例:第 1 回合使用 $\rightarrow$ 第 2/3/4 冷却 $\rightarrow$ 第 5 回合可用,每 4 回合最多 1 次) |
| 神相 | 2 | 2 | 屏障(主动,消耗 2 AP):在指定格子为中心生成 $3 \times 3$ 正方形屏障(共 9 格),部署当回合及随后 2 回合生效,总计 3 点耐久,保障可部署地图内任意坐标,无需与神相相邻(远程魔法) |
| 普通弟子 | 3 | 2 | 无特殊能力 |
属性说明:
HP:生命值上限(初始即为上限)。降为 0 时 NPC 立即死亡,不可再被移动,死亡后留在格子立即释放
速度:每回合该 NPC 的最大移动距离(受哈顿距离 $\le$ 速度值)。移动检查目标格子的合法性(非山崖、在地块内)和受哈顿距离 $\le$ 速度值——不检查起点到终点路径中间是否有障碍。NPC 具有轻功,可跨越中间的山崖或河流。
1.3 碰撞规则
每个格子最多同时站 1 个 NPC
若你的输出中有两个都在移动的 NPC 移动到同一格子:id 较小的 NPC 获得该位置,另一个停留在原地并计一次碰撞违规(-20 分)
同一回合内的移动视为并发执行:NPC 离开的格子立即释放,可被其他 NPC 在同回合进入。两个 NPC 互换位置是合法的(如 NPC A 去 B 的原位,B 去 A 的原位)
若目标格有 NPC 原地不动,则该格视为已被占据,其他 NPC 不可进入(无论 id 大小)
本题不检查移动路径,也不做额外的锁死判定。只要目标格在范围内、不是山崖,移动距离不超过速度,该移动就是合法候选;若不想移动,输出原坐标即可。
1.4 行动点数(AP)
每回合你有一个行动点数预算(在事件结算前统计,使用体时的存活 NPC 数量):
$\text{每回合 AP} = \text{存活 NPC 数量}$
| 操作 | AP 消耗 |
|---|---|
| 移动 1 格(任意 NPC) | 1 AP |
| 药王弟子治疗 | 0 AP(有冷却限制) |
| 神相部署屏障 | 2 AP |
约束:
每个 NPC 移动距离不能超过自身速度
总 AP 消耗不能超过本回合预算
超出 AP 预算 $\rightarrow$ 所有 NPC 本回合原地不动,ABILITY 指令一律失效,且额外扣 200 分
未用完的 AP 不累积到下一回合
这意味着你有 $N$ 个 NPC 但只有 $N$ 点 AP——必须决定哪些 NPC 移动、移动多少,全员满程冲刺必然超出预算。
二、灾劫事件
游戏共有 N 个事件按时间顺序依次发生。一个“回合/STEP”可能包含多个事件(每个 STEP 至少 1 个事件,不存在空回合)。
2.1 回合时序
每个回合严格按照以下顺序执行:
1 | 回合 k 开始 |
关键时序要点:
步骤 [4] 治疗和屏障在本回合事件前生效
步骤 [5] 事件按顺序结算:若 HEAL 事件出现在伤害事件之前,NPC 先血再受伤
最后一回合(所有 N 个事件已处理完毕)不输出 WARNING 行
所有 N 个事件分布在若干回合中处理完毕后,裁判输出 FINAL(见 3.3 节)
矩形事件坐标保证 x1 $\le$ x2、y1 $\le$ y2
移动碰撞解析、事件内 NPC 结算顺序、护卫与 AP 的确定性细节参见 4.6,严格按其实现即可与裁判保持一致
2.2 事件类型
妖兽出没 MONSTER
圆形区域(曼哈顿圆),半径 $R$($1 \le R \le 5$)。区域内所有 NPC 受到 1 点伤害。河流上额外 +1(共 2 点),密林上无特殊效果(1 点)。
天雷滚滚 LIGHTNING
精准命中坐标 $(x, y)$。命中位置的地形决定效果:
LIGHTNING 命中 $(x, y)$
├── 地形 = 密林(3) $\rightarrow$ 电流扩散:曼哈顿距离 $\le 1$ 范围内所有 NPC(含中心格)各受 1 点伤害
├── 地形 = 山崖(1) $\rightarrow$ 落石溅射:曼哈顿距离 $\le 1$ 范围内所有 NPC(山崖格不可站立,故中心格无 NPC)
└── 其他(平地/河流) $\rightarrow$ 精准雷击:该格 NPC 受到致命伤害(等效伤害 =999,HP 直接归零)
致命伤害可被屏障吸收(扣 1 耐久,NPC 存活)。铁衣卫护卫只能代受 1 点伤害;若致命伤害未被屏障吸收,护卫无法救下目标。屏障和护卫同时存在时屏障优先结算。
暴雨倾盆 RAINSTORM
矩形区域 $(x1, y1) \sim (x2, y2)$,**保证 **$x1 \le x2, y1 \le y2$(对角坐标,闭区间)。区域内 NPC 受 1 点伤害。河流上额外 +1(共 2 点),密林上 **伤害 **$= \text{floor}(\text{伤害}/2)$:$1 \rightarrow 0$。
地动山摇 EARTHQUAKE
矩形区域,保证 $x1 \le x2, y1 \le y2$。区域内 NPC 受 1 点伤害。以 NPC 所在格到最近山崖格子的曼哈顿距离为准,若 $\le 1$ 则额外 $+1$(落石)。此处山崖指地图上任意山崖格,不限于事件区域内。河流上完全免疫。
烈火燎原 WILDFIRE
圆形区域(曼哈顿圆),半径 $R$($1 \le R \le 5$)。区域内 NPC 受 2 点伤害。密林上减半 = floor(2/2) = 1。河流上免疫。
甘霖天降 HEAL
圆形区域(曼哈顿圆),半径 $R$($1 \le R \le 5$)。区域内存活 NPC 恢复 1 点 HP(不能超过上限)。河流上额外 $+1$(共恢复 2 点)。
2.3 事件信息
每回合行动前,裁判程序会给出本回合即将结算的全部事件的类型与精确参数(圆形事件的中心与半径、矩形事件的对角坐标,天雷的命中坐标)。
2.4 影舞者预警
如果当前有影舞者存活,裁判程序在每个 STEP 行之后会额外输出一行:
1 | WARNING <direction_1> <direction_2> ... |
列出下回合所有事件中心相对于天机弟子当前位置的方向,8 方位重后顺时针(N->NE->E->SE->S->SW->W->NW)排序。影舞者只决定是否提供预警,方向坐标系始终以天机弟子为原点
仅方向,无类型、无参数、不说明数量,影舞者死亡后 WARNING 行消失
最后一回合(所有事件处理完毕)不输出 WARNING 行
WARNING 只是下回合事件方向的提前预警,仅供你提前调整阵型、走位与屏障部署,不含事件类型与参数。本回合的全部事件始终以精确参数输出(见 2.3),你可据此精准推演本回合 NPC 状态。
三、交互协议
3.1 初始化阶段
裁判程序输出初始状态(所有坐标 0-indexed,每行数字均以空格分隔):
1 | INIT <W> <H> |
职业代号: 'SEER'(天机弟子,id 固定为 1)、'VANGUARD'(铁衣卫)、'SHADOW'(影舞者)、'HEALER'(药王弟子)、'MAGE'(神相)、'COMMON'(普通弟子)
3.2 事件循环
每个回合,裁判输出:
1 | STEP <k> |
事件参数格式(均为精确值,坐标 0-indexed):
圆形事件(
MONSTER/WILDFIRE/HEAL):<TYPE> <cx> <cy> <R>矩形事件(
RAINSTORM/EARTHQUAKE):<TYPE> <x1> <y1> <x2> <y2>(保证 $x1 \le x2, y1 \le y2$)天雷(
LIGHTNING):<TYPE> <x> <y>
你的程序应尽快输出。裁判会记录从本回合输入结束到收到该 DONE 的耗时:超过约 0.1 秒开始按耗时扣少量分;若未输出 DONE,额外扣 50 分。请务必在 3 秒 超时窗口内完成本回合输出。
输出格式:
1 | <id> <new_x> <new_y> |
每一个 存活 NPC,格式
<id> <new_x> <new_y>。若同一 id 输出多次,以最后一次坐标为准(仍可能因乱序产生扣分)必须按 id 升序输出(乱序连违 $-5$/行,如 10 行全乱序惩 -50)
不想移动的 NPC 也要输出(坐标与原位置相同即可),不能遗漏
最后必须以独占一行的
DONE结束(缺少 DONE 扣 50 分)为保证预览与判题稳定,单回合输出应保持简洁。若程序在一个回合内输出超过 1000 行,单行过长或累计输出过大,裁判会截断本回合输出并按输出异常处理。
特殊能力指令(可选,放在 NPC 移动行之后、DONE 之前):
1 | ABILITY HEAL <healer_id> <target_id> -- 药王弟子治疗目标 NPC(需相邻,不可超过 HP 上限) |
能力指令在能力阶段(步骤 [4])统一执行:先执行所有 HEAL,再执行所有 BARRIER,同类型按输出顺序。非法 HEAL 指令会被忽略,不消耗 AP,也不扣分。BARRIER 指令只要 mage_id 是存活神相,就会计入 2 AP 预算;若屏障中心越界,最终不会生成屏障,但该指令仍可能参与 AP 超预算判定。
铁衣卫的「护卫」是被动能力——不需要主动指令,裁判程序在事件结算时自动计算。
3.3 结算阶段
所有 N 个事件处理完毕后(N 在 INIT 阶段告知),裁判程序输出:
1 | FINAL <score> |
程序收到 FINAL 后应自行退出;不存在 0 事件的空回合——每个 STEP 至少包含 1 个事件。
四、违规规则
4.1 移动合法性检查
同一回合内的多项违规会累加扣分。对于单个 NPC 的目标坐标合法性检查,裁判按「越界 $\rightarrow$ 山崖 $\rightarrow$ 超速」顺序检查,命中其中一项后续 NPC 移动无效并停留原位,但仍受本回合事件影响。
| 检查项 | 扣分 |
|---|---|
| 输出已死亡 NPC 的移动 | -50 / 次 |
| 目标坐标超出地图边界 | -30 / 次 |
| 目标在山崖上 | -30 / 次 |
| 移动距离超过 NPC 速度 | -20 / 次 |
| 遗漏存活 NPC / 未升序输出 | -15 / -5每行 |
| 碰撞 / 缺 DONE / AP 超限 | -20 / -50 / -200 |
| 输出耗时过长或过量 | 按量扣分或截断 |
4.2 屏障规则
形状:以指定格子 $(cx, cy)$ 为中心的 $3 \times 3$** 正方形区域**,共 9 格(所有满足 $\vert{}x-cx\vert{} \le 1$ 且 $\vert{}y-cy\vert{} \le 1$ 的格子)。超出地图边界的部分无效(自动裁剪)
部署:花费 2 AP,在本回合事件发生前生效,保护部署当回合及随后 2 个回合
耐久:初始 3 点。屏障内的 NPC 每次受到事件伤害时,先消耗屏障 1 点耐久抵消伤害,耐久归零后屏障消失
重叠:若多个屏障覆盖同一格,每次伤害优先消耗剩余耐久更少的屏障;耐久相同时,先部署的先消耗;只消耗 1 个屏障的耐久
上限:一次伤害最多消耗 1 点屏障耐久
持续:部署当回合及随后 2 个回合,之后在回合清理阶段自动消失
范围:神相可在地图内任意坐标部署屏障,无需与神相相邻;屏障中心越界时不会生成屏障;中心可以是任意地形
与护卫的区别:屏障完全抵消该次伤害(如天雷致命伤害也被吸收);护卫仅代受 1 点,剩余伤害仍由原目标承受。屏障优先于护卫结算
4.3 护卫规则
触发条件:铁衣卫存活,目标 NPC 与铁衣卫曼哈顿距离 $= 1$
限额:每名铁衣卫每回合独立有 1 次护卫额度
触发时机:事件结算(步骤 [5]):相邻 NPC 受到伤害(含天雷致命伤害)时,铁衣卫代承受
代受伤害量:固定 1 点/次。事件伤害 $> 1$(如烈火 2 点),铁衣卫代受 1 点,剩余由原目标承受
屏障优先:目标在屏障内,屏障先挡。屏障处理后的剩余伤害视为「屏障不存在」,护卫可触发
多铁衣卫链式护卫:同一伤害结算中,若多名铁衣卫相邻目标且各有剩余额度,按铁衣卫 id 从小到大依次触发,每人代受 1 点,直至伤害归零或额度耗尽
多 NPC 优先级:若同一事件命中多个 NPC 时,按 id 升序逐个结算伤害(含屏障吸收和护卫触发,天机弟子 id=1 天然最高优先级)
4.4 天机弟子护送规则
- 天机弟子在任意时刻死亡 $\rightarrow$ 本局总分直接归零(
score = 0)
4.5 计分目标
天机弟子在任意时刻死亡时,本局得分为 0。
天机弟子存活时,队伍承受的伤害越少、死亡 NPC 越少、违规越少,得分越高。
屏障吸收的伤害不计入 NPC 伤害;铁衣卫代受的伤害计入铁衣卫自身。
请尽快完成每回合输出,输出耗时较长会扣分;缺少
DONE会额外扣分。
4.6 确定性细节
为便于你与裁判程序严格对齐,本题以下细节均为确定规则:
AP 预算按本回合事件结算前的存活 NPC 数量计算;移动 AP 按起点到最终合法目标格的曼哈顿距离累计。
移动只检查目标格是否在地块内、不是山崖、且曼哈顿距离不超过该 NPC 速度,不检查中间路径。
若目标格有 NPC 原地不动,该格视为已被占据,其他 NPC 不可进入;若多个移动 NPC 争同一个空格,id 小者进入,其余回原位并计碰撞。
能力阶段总是先处理所有
ABILITY HEAL,再处理所有ABILITY BARRIER;同类型内按输出顺序处理。同一事件命中多个 NPC 时,按 id 升序结算。屏障先于护卫;多个护卫按铁衣卫 id 开序触发。
LIGHTNING在平地或河流上的精准雷击是致命伤害;若没有屏障抵挡,铁衣卫护卫无法救下目标。屏障部署当回合及随后 2 个回合有效,清理阶段到期移除;重叠屏障优先消耗剩余耐久更少者,耐久相同则先部署者优先。
五、约束与限制
| 项目 | 范围 |
|---|---|
| 地图 $W \times H$ | $15 \times 15 \sim 80 \times 80$ |
| NPC 总数 $M$ | $8 \le M \le 50$ |
| 天机弟子 | 1 名,id=1 |
| 其他职业 | 随机组合(至少含 1 铁衣卫) |
| 事件数量 $N$ | $10 \le N \le 200$ |
| 圆形事件半径 $R$ | $1 \le R \le 5$ |
| 矩形事件最大边长 | $\le \min(W, H) / 2$ |
| 单回合最大事件数 | $\le 5$ |
| 每回合 AP | 存活 NPC 数量 |
| 响应超时窗口 | 3 秒 |
| 测试用例数 | 由评测方确定 |
生成器保证:
地图至少含 1 个山崖格子和 1 个河流格(确保地形交互规则的覆盖)
NPC 初始位置:随机崖格子,不重叠,天机弟子周围曼哈顿距离 3 内有 2 个非山崖空格
至少 30% 事件会覆盖天机弟子初始位置 $\pm 5$ 格范围
事件位置完全随机,不刻意避开或针对 NPC
**矩形事件坐标保证 **$x1 \le x2, y1 \le y2$
六、完整样例
初始化状态
1 | INIT 10 10 |
STEP 1
1 | STEP 1 |
你的输出:
1 | 1 0 1 |