1 条题解
-
0
🔍 问题核心与关键点
题目给定一个边长为
a的立方体,包含a³个水晶。其中n个是光源(g_i = 0),它们在夜晚会随机等概率地向六个方向(上下左右前后)之一发射光线,光线会穿透并照亮整条射线上的所有水晶。每个非光源水晶有一个好看程度g_i,我们需要找出所有可能的光源方向组合下,被照亮水晶好看程度总和的最小值与最大值。题目输入的挑战在于:没有直接给出每个水晶的三维坐标,只给出了每个水晶的编号及其有公共面的邻接水晶编号。因此,我们首先需要根据这些邻接信息,还原出每个水晶在立方体中的具体坐标
(x, y, z)。🧭 重建三维坐标
重建坐标是整个问题的基础,这里介绍一种基于寻找角点并通过BFS计算曼哈顿距离来推导坐标的方法:
- 寻找起始角点:在一个
a x a x a的立方体中,位于角上的水晶有且仅有3个邻接水晶(即度为3)。我们可以找到任意一个度为3的水晶,将其标记为原点(1,1,1)。 - 第一次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、且到原点曼哈顿距离为
2*(a-1)的水晶。这个点就是该表面上与原点处于对角线位置的角点。例如,如果我们选择的是xoy平面,这个点可能是(a, a, 1)。 - 第二次BFS:从这个对角点(例如
(a,a,1))开始进行BFS,得到到所有点的曼哈顿距离dis1[i]。 - 计算Z坐标:对于任意一个水晶
i,我们可以利用以下关系式求出其z坐标:z = (dis0[i] + dis1[i] - 2*(a-1)) / 2 + 1(具体计算可能因坐标起始点定义不同而微调) - 确定第三个角点并计算X,Y坐标:用类似的方法,我们可以再找到同一个表面上的另一个角点(例如
(a,1,1)),进行第三次BFS得到dis2[i],然后利用距离关系求出x和y坐标。最后,所有水晶的坐标(x,y,z)都可以通过这三次BFS得到的距离信息确定下来。
💡 计算好看程度极值
在确定了所有水晶的坐标后,我们需要计算所有可能的光源方向组合下,被照亮水晶的好看程度总和的最小值和最大值。
- 枚举所有方向组合:每个光源有6个可能的照射方向(上下左右前后)。由于
n ≤ 8,方向组合总数最多为6⁸(约167万种),这在现代计算机上是可枚举的。 - 模拟光照并统计好看程度:对于每一种方向组合,我们需要模拟每个光源沿其方向照亮整条射线上的水晶。关键点:同一个水晶即使被多个光源照亮,其好看程度也只被计算一次。因此,在模拟时,我们需要一个标记数组(如
vis[x][y][z])来记录某个水晶是否已被照亮过。 - 更新极值:对于每种组合计算出的总好看程度,我们更新全局的最小值和最大值。
- 优化:在DFS枚举方向组合时,注意及时清理标记数组,避免对下一种组合产生影响。
🛠️ 代码实现提示
- 坐标重建:务必确保坐标重建的准确性,这是后续计算的基础。可以先用小样例(如
a=2)进行验证。 - 光照模拟:在模拟光线照射时,注意循环的边界条件,确保不会超出立方体范围
[1, a]。 - 避免重复计算:使用标记数组是保证水晶好看程度不重复计算的关键。
- 输入处理:由于输入格式中每行的邻接水晶数量不固定(3~6个),建议使用
stringstream或类似方法读取,以避免遗漏。
💎 总结
解决 "璀灿光华" 这道题,主要分为两大步骤:
- 重建三维坐标:通过寻找角点并进行BFS,利用曼哈顿距离关系确定每个水晶的
(x, y, z)坐标。 - 枚举求极值:通过DFS枚举所有光源的方向组合,模拟光照过程,并注意避免重复计算,找出总好看程度的最小值和最大值。
- 寻找起始角点:在一个
- 1
信息
- ID
- 5677
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者