1 条题解

  • 0
    @ 2025-11-28 13:06:54

    🔍 问题核心与关键点

    题目给定一个边长为 a 的立方体,包含 个水晶。其中 n 个是光源(g_i = 0),它们在夜晚会随机等概率地向六个方向(上下左右前后)之一发射光线,光线会穿透并照亮整条射线上的所有水晶。每个非光源水晶有一个好看程度 g_i,我们需要找出所有可能的光源方向组合下,被照亮水晶好看程度总和的最小值与最大值

    题目输入的挑战在于:没有直接给出每个水晶的三维坐标,只给出了每个水晶的编号及其有公共面的邻接水晶编号。因此,我们首先需要根据这些邻接信息,还原出每个水晶在立方体中的具体坐标 (x, y, z)

    🧭 重建三维坐标

    重建坐标是整个问题的基础,这里介绍一种基于寻找角点并通过BFS计算曼哈顿距离来推导坐标的方法:

    1. 寻找起始角点:在一个 a x a x a 的立方体中,位于角上的水晶有且仅有3个邻接水晶(即度为3)。我们可以找到任意一个度为3的水晶,将其标记为原点 (1,1,1)
    2. 第一次BFS:从原点 (1,1,1) 开始进行BFS,计算到所有其他水晶的曼哈顿距离 dis0[i](即 |x1-x2| + |y1-y2| + |z1-z2|)。对于原点 (1,1,1)(x,y,z) 的曼哈顿距离就是 (x-1) + (y-1) + (z-1)
    3. 确定对角点:在立方体的同一个表面上,寻找一个也是度为3、且到原点曼哈顿距离为 2*(a-1) 的水晶。这个点就是该表面上与原点处于对角线位置的角点。例如,如果我们选择的是 xoy 平面,这个点可能是 (a, a, 1)
    4. 第二次BFS:从这个对角点(例如 (a,a,1))开始进行BFS,得到到所有点的曼哈顿距离 dis1[i]
    5. 计算Z坐标:对于任意一个水晶 i,我们可以利用以下关系式求出其 z 坐标: z = (dis0[i] + dis1[i] - 2*(a-1)) / 2 + 1 (具体计算可能因坐标起始点定义不同而微调)
    6. 确定第三个角点并计算X,Y坐标:用类似的方法,我们可以再找到同一个表面上的另一个角点(例如 (a,1,1)),进行第三次BFS得到 dis2[i],然后利用距离关系求出 xy 坐标。最后,所有水晶的坐标 (x,y,z) 都可以通过这三次BFS得到的距离信息确定下来。

    💡 计算好看程度极值

    在确定了所有水晶的坐标后,我们需要计算所有可能的光源方向组合下,被照亮水晶的好看程度总和的最小值和最大值。

    1. 枚举所有方向组合:每个光源有6个可能的照射方向(上下左右前后)。由于 n ≤ 8,方向组合总数最多为 6⁸(约167万种),这在现代计算机上是可枚举的。
    2. 模拟光照并统计好看程度:对于每一种方向组合,我们需要模拟每个光源沿其方向照亮整条射线上的水晶。关键点同一个水晶即使被多个光源照亮,其好看程度也只被计算一次。因此,在模拟时,我们需要一个标记数组(如 vis[x][y][z])来记录某个水晶是否已被照亮过。
    3. 更新极值:对于每种组合计算出的总好看程度,我们更新全局的最小值和最大值。
    4. 优化:在DFS枚举方向组合时,注意及时清理标记数组,避免对下一种组合产生影响。

    🛠️ 代码实现提示

    • 坐标重建:务必确保坐标重建的准确性,这是后续计算的基础。可以先用小样例(如 a=2)进行验证。
    • 光照模拟:在模拟光线照射时,注意循环的边界条件,确保不会超出立方体范围 [1, a]
    • 避免重复计算:使用标记数组是保证水晶好看程度不重复计算的关键。
    • 输入处理:由于输入格式中每行的邻接水晶数量不固定(3~6个),建议使用 stringstream 或类似方法读取,以避免遗漏。

    💎 总结

    解决 "璀灿光华" 这道题,主要分为两大步骤:

    1. 重建三维坐标:通过寻找角点并进行BFS,利用曼哈顿距离关系确定每个水晶的 (x, y, z) 坐标。
    2. 枚举求极值:通过DFS枚举所有光源的方向组合,模拟光照过程,并注意避免重复计算,找出总好看程度的最小值和最大值。
    • 1

    信息

    ID
    5677
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者