【笔试刷题】网易-2026.04.12-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🤖 内容包含AI辅助生成,题解和代码均经过多轮验证,有问题欢迎评论
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
网易-2026.04.12
题目总览
| 题号 | 题名 | 主要做法 | 难度 |
|---|---|---|---|
| 1 | 镜面照明实验 | 网格模拟 + 状态判重 | 中等 |
| 2 | 双核编译排期 | 状态压缩最短路 | 困难 |
这套网易题量不多,但两题都不是扫一眼就能写完的类型。第一题要把反射和判重写稳,第二题则是小范围状态搜索,重点在于把调度过程编码干净。
1. 小兰的镜面照明实验
问题描述
小兰正在调试一块用于模拟灯光传播的训练场地。场地被划成一个 的网格,每个格子只会是下面几种类型之一:
#:障碍物。.:空地。/、\:镜子。L、R、U、D:一盏灯,分别表示它的初始照射方向为左、右、上、下。
每盏灯都会从自己的位置出发,沿当前方向一格一格传播。传播过程中遵循下面的规则:
-
如果下一格是障碍物或另一盏灯,那么光线会在进入前停下。
-
如果光线进入了
/,方向会立刻变化:,
,
,
。
-
如果光线进入了
\,方向会立刻变化:,
,
,
。
-
镜子格子可以被光线穿过,但镜子本身不算空地,不计入被照亮次数。
对每个空地格子,定义它的亮度为“能照到它的灯的数量”。同一盏灯即使经过回路,也只会对同一个空地贡献一次。
请输出整个场地的亮度分布:
- 空地输出被多少盏灯照到。
- 障碍物、镜子、灯所在格子统一输出
。
输入格式
第一行输入两个整数 ,表示网格的行数和列数。
接下来输入 行字符串,每行长度都为
,表示这张地图。
保证地图中的字符只会出现在 #、.、/、\、L、R、U、D 之中。
输出格式
输出 行,每行输出
个整数,相邻整数之间用一个空格分隔。
对于每个位置:
- 若该格子是空地,输出它的亮度。
- 若该格子是障碍物、镜子或灯,输出
。
样例输入
3 4
R.#.
..#.
.L..
4 4
R/L.
....
R...
....
样例输出
-1 1 -1 0
0 0 -1 0
1 -1 0 0
-1 -1 -1 0
0 1 0 0
-1 2 1 1
0 1 0 0
数据范围
- 镜子格子的总数不超过
- 灯格子的总数不超过
样例说明
- 样例 1:第一行最左侧的右向灯会照亮第一行第二列,第三行第二列的左向灯会照亮第三行第一列。障碍物会直接截断传播,所以其后的空地不会继续被同一束光照到。
- 样例 2:第一行的光线会先进入镜子,再发生转向。第三行最左侧的右向灯会穿过一整行,因此第三行第二列同时被两盏灯照到,输出为
。
题解
题意本身不难,关键是把“每盏灯怎么走”模拟清楚,并且防止镜子把同一盏灯带进死循环。
一、直接按灯模拟
灯的数量最多是 ,整张地图的总格子数最多是
。
这说明就算对每盏灯单独做一次传播模拟,总工作量也仍然可控。
做法很直接:
- 扫描整张地图,找出每一盏灯。
- 按灯的初始方向出发,一格一格往前走。
- 走到空地时,把这个格子的答案加一。
- 走到镜子时,先改方向,再继续前进。
- 走到边界外,或者下一格是障碍物、另一盏灯时停止。
二、为什么需要“位置 + 方向”去重
如果场地里有镜子,光线可能形成回路。
例如一束光经过几块镜子后,重新回到之前到过的位置,但这时它的朝向也许已经和上次一样了。只要再次出现同一个“位置 + 方向”状态,后面的轨迹就会完全重复,再继续模拟已经没有意义。
因此可以为每盏灯维护一个访问标记:
- 状态写成
(x, y, dir)。 - 如果当前灯已经到过这个状态,就立刻停止。
这样既能避免死循环,也能保证同一盏灯不会对同一段循环路径重复计数。
三、镜子反射怎么写
把四个方向编号成:
0:上。1:右。2:下。3:左。
那么两种镜子的反射关系可以直接写成数组。
对于 /,反射映射是 。
对于 \,反射映射是 。
这样模拟时只要看当前格子是哪种镜子,就能在 时间改方向。
四、复杂度分析
设一盏灯传播过程中经过的状态数为 。每盏灯在同一个
(位置,方向) 上最多只会停留一次,因此单盏灯的复杂度是 。
总复杂度可以写成 。在本题范围下,这个量级足以通过。
额外空间主要是答案数组和访问标记,复杂度为 。
参考代码(Python)
import sys
input = lambda: sys.stdin.readline().strip()
def solve():
# Read input in ACM mode and build the answer directly.
n, m = map(int, input().split())
g = [input() for _ in range(n)]
# 方向顺序固定为:上、右、下、左。
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
mp = {"U": 0, "R": 1, "D": 2, "L": 3}
# 两种镜子的反射映射。
ref1 = [1, 0, 3, 2]
ref2 = [3, 2, 1, 0]
ans = [[0] * m for _ in range(n)]
vis = [[[0] * 4 for _ in range(m)] for _ in range(n)]
lid = 0
def ok(x, y):
return 0 <= x < n and 0 <= y < m
for i in range(n):
for j in range(m):
if g[i][j] not in mp:
continue
lid += 1
d = mp[g[i][j]]
x = i + dx[d]
y = j + dy[d]
# 每盏灯独立模拟,出现重复状态就说明进入了循环。
while ok(x, y):
c = g[x][y]
if c == "#" or c in mp:
break
if vis[x][y][d] == lid:
break
vis[x][y][d] = lid
# 只有空地才累加亮度。
if c == ".":
ans[x][y] += 1
elif c == "/":
d = ref1[d]
else:
d = ref2[d]
x += dx[d]
y += dy[d]
out = []
for i in range(n):
row = []
for j in range(m):
if g[i][j] == ".":
row.append(str(ans[i][j]))
e
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

查看15道真题和解析