【笔试刷题】网易-2026.04.12-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🤖 内容包含AI辅助生成,题解和代码均经过多轮验证,有问题欢迎评论

🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

网易-2026.04.12

题目总览

题号 题名 主要做法 难度
1 镜面照明实验 网格模拟 + 状态判重 中等
2 双核编译排期 状态压缩最短路 困难

这套网易题量不多,但两题都不是扫一眼就能写完的类型。第一题要把反射和判重写稳,第二题则是小范围状态搜索,重点在于把调度过程编码干净。

1. 小兰的镜面照明实验

问题描述

小兰正在调试一块用于模拟灯光传播的训练场地。场地被划成一个 的网格,每个格子只会是下面几种类型之一:

  • #:障碍物。
  • .:空地。
  • /\:镜子。
  • LRUD:一盏灯,分别表示它的初始照射方向为左、右、上、下。

每盏灯都会从自己的位置出发,沿当前方向一格一格传播。传播过程中遵循下面的规则:

  • 如果下一格是障碍物或另一盏灯,那么光线会在进入前停下。

  • 如果光线进入了 /,方向会立刻变化:

  • 如果光线进入了 \,方向会立刻变化:

  • 镜子格子可以被光线穿过,但镜子本身不算空地,不计入被照亮次数。

对每个空地格子,定义它的亮度为“能照到它的灯的数量”。同一盏灯即使经过回路,也只会对同一个空地贡献一次。

请输出整个场地的亮度分布:

  • 空地输出被多少盏灯照到。
  • 障碍物、镜子、灯所在格子统一输出

输入格式

第一行输入两个整数 ,表示网格的行数和列数。

接下来输入 行字符串,每行长度都为 ,表示这张地图。

保证地图中的字符只会出现在 #./\LRUD 之中。

输出格式

输出 行,每行输出 个整数,相邻整数之间用一个空格分隔。

对于每个位置:

  • 若该格子是空地,输出它的亮度。
  • 若该格子是障碍物、镜子或灯,输出

样例输入

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:第一行的光线会先进入镜子,再发生转向。第三行最左侧的右向灯会穿过一整行,因此第三行第二列同时被两盏灯照到,输出为

题解

题意本身不难,关键是把“每盏灯怎么走”模拟清楚,并且防止镜子把同一盏灯带进死循环。

一、直接按灯模拟

灯的数量最多是 ,整张地图的总格子数最多是

这说明就算对每盏灯单独做一次传播模拟,总工作量也仍然可控。

做法很直接:

  1. 扫描整张地图,找出每一盏灯。
  2. 按灯的初始方向出发,一格一格往前走。
  3. 走到空地时,把这个格子的答案加一。
  4. 走到镜子时,先改方向,再继续前进。
  5. 走到边界外,或者下一格是障碍物、另一盏灯时停止。

二、为什么需要“位置 + 方向”去重

如果场地里有镜子,光线可能形成回路。

例如一束光经过几块镜子后,重新回到之前到过的位置,但这时它的朝向也许已经和上次一样了。只要再次出现同一个“位置 + 方向”状态,后面的轨迹就会完全重复,再继续模拟已经没有意义。

因此可以为每盏灯维护一个访问标记:

  • 状态写成 (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%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务