具有扩展单元的旅行图问题的多源 BFS

问题描述

您将获得一个 M x M 网格(7

您可以从任何起始位置开始。在一个单位时间内,您可以前往任何相邻的单元格(您上方的单元格、您右侧的单元格、您左侧的单元格或下方的单元格)。每T个单位时间后,你占据的细胞数量向所有4个方向扩展。当你以后旅行到不同的细胞时,你占据的所有细胞都会在同一个方向上协调一致地移动。

例如,如果您在每 1 个单位时间后扩展,并且您在向右移动一个空网格,这就是您占据的单元格将如何扩展,其中 O = 您占据的正方形:

.......  .......  .......
.......  .......  ..O....
.......  .O.....  .OOO...
O......  OOO....  OOOOO..
.......  .O.....  .OOO...
.......  .......  ..O....
.......  .......  .......

如果在移动到相邻的单元格或扩展后,您的一个单元格移动到无法访问的方格,您将停止移动或扩展。您最终将始终停止移动或扩展,因为网格的边界都无法访问。

问题是确定你可以占据多少不同的方格。

示例: 网格为 10 x 10,每 2 个单位时间后扩展一次。起始位置用S标记,无法进入的单元格用X标记,可以占据的空格用“.”标记

XXXXXXXXXX
X.X......X
X.X......X
XS.......X
X.X......X
X.X......X
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX

可以到达的位置数量是 28。它们在网格上用 Os 标记

XXXXXXXXXX
XOX.OOO..X
XOXOOOOO.X
XOOOOOOOOX
XOXOOOOO.X
XOX.OOO..X
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX
XXXXXXXXXX

我的解决方案:

首先,由于网格的最大尺寸为 1000 x 1000 单位,您可以存储一个布尔 M x M 矩阵,该矩阵存储是否可以到达特定正方形。在解决方案结束时,您将遍历此矩阵,并计算可能被占用的方格数。

我必须解决这个问题的一个想法是使用多源 BFS。您将首先将所有起始位置添加到队列中。状态可以是 [M][M][K],其中前两个状态对应于在网格内占据的位置,而 K 对应于必须扩展之前剩余的时间单位数。您可以以这种方式处理单独占用的每个单元。每次处理一个状态时,都会将四个状态添加回队列:[M - 1][M][K - 1]、[M + 1][M][K - 1]、[M][M] - 1][K - 1] 和 [M][M + 1][K - 1]。如果 K = 0 在任何时间点,您将添加状态 [M - 1][M][K],[M + 1][M][K],[M][M - 1][K],和 [M][M + 1][K] 回到队列中。您最终会到达以这种方式可以到达的所有单元格。

这种方法的问题在于,如果大量单元格中的任何单元格移动到边界或无法访问的方块中,您将无法继续移动或扩展。使用我上面概述的解决方案,无法知道当前单元格是否可以继续移动或扩展。

我该如何解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)