2 solutions
-
0
题面描述
在一个 的网格中,每个单元格代表不同的能量强度,其中灰色单元格为禁地,橙色单元格为能量覆盖区域,绿色单元格为生命之树,表示生命之树散发的初始能量强度。能量强度会向外传播,每向外一格减少 ,最低为 。若某位置接收到多棵生命之树的能量,取最大值。如果能量强度低于阈值 ,则能量中断。任务是从左上角到右下角寻找一条信号不中断的最短路径,若不存在则返回 。
思路:Dijkstra算法,最短路
容易这个问题可以分成两部分求解: 第一步:求解网格内每个点的最大信号强度。 第二步:对最大信号强度大于等于 ,且相邻的点对连边,最后输出出发点到终点的最短路。
对于第一步,我们可以先建一个图,把网格上的每一个点映射到图上的点,并在图上创建一个虚拟的源点,对于每个网格图上的点,当它的信号强度为 时, 从源点到网格图上的点连一条边权为 的边。
然后对于每个在网格图上相邻的节点,我们在它们之间连一条边权为 的边,此时虚拟源点到每个网格图上的点的最短路即为负的最大信号强度,因为容易发现我们只是把操作反着进行了。
对于第二步,我们通过 ,求解出发点到终点的最短路,注意特判出发点不合法的情况。
题解
这个问题可以分为两个主要部分进行求解:
-
计算每个网格点的最大信号强度:
- 我们可以构建一个图,将网格中的每个点映射为图上的点,并创建一个虚拟源点。对于每个网格点,当其信号强度为 时,从源点到该网格点连一条权重为 的边。这样,当我们进行最短路径计算时,实际得到的是每个点的最大信号强度的负值。
- 此外,对于相邻的网格点(上下左右),我们在它们之间连一条权重为 的边。这样,每个网格点的最短路径即为负的最大信号强度。
-
寻找从起点到终点的最短路径:
- 在确定了每个点的最大信号强度后,我们需要判断哪些点的信号强度大于等于给定的阈值 ,并在这些点之间建立边。最后,使用广度优先搜索(BFS)算法,计算从起点到终点的最短路径。
代码
cpp
-
- 1
Information
- ID
- 72
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 100
- Accepted
- 7
- Uploaded By