Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在网格上填充瓷砖,以便可以访问所有未填充的瓷砖_Algorithm - Fatal编程技术网

Algorithm 在网格上填充瓷砖,以便可以访问所有未填充的瓷砖

Algorithm 在网格上填充瓷砖,以便可以访问所有未填充的瓷砖,algorithm,Algorithm,有人能告诉我一个解决以下问题的算法吗 假设我有一个10*10的瓷砖网格。每个瓷砖可以是“满”(玩家不能在上面行走)或“空”(玩家可以在上面行走)。我想浏览并随机填充瓷砖(以创建更有趣的地图),但是我需要所有“空”瓷砖才能访问。下面是一个快速图形: 我们从这一点开始: _ _ _ _ _ _ _ _ _ _ |_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_| |_|_|_|

有人能告诉我一个解决以下问题的算法吗

假设我有一个10*10的瓷砖网格。每个瓷砖可以是“满”(玩家不能在上面行走)或“空”(玩家可以在上面行走)。我想浏览并随机填充瓷砖(以创建更有趣的地图),但是我需要所有“空”瓷砖才能访问。下面是一个快速图形:

我们从这一点开始:

 _ _ _ _ _ _ _ _ _ _
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|
|_|_|_|_|_|_|_|_|_|_|

然后检查并填充一些瓷砖:

 _ _ _ _ _ _ _ _ _ _
|#|_|_|#|_|#|_|_|_|_|
|_|_|#|_|_|_|_|_|#|_|
|_|_|#|_|_|#|#|_|#|_|
|_|_|_|_|#|#|#|_|_|#|
|_|#|_|_|_|_|_|_|_|_|
|_|_|_|#|_|#|_|#|_|_|
|#|#|_|_|_|_|#|_|_|#|
|_|_|_|_|#|_|#|_|_|_|
|_|_|#|_|_|_|_|#|_|_|

并删除所有额外的行(仅用于显示):

正如您所看到的,我们现在只剩下一个更有趣的地图,并且可以随机生成(根据我们决定何时“填充”平铺的方式)。然而,使用简单的随机性可能导致如下情况:

 _ _ _ _ _ _ _ _ _ _
|#     #   #       #|
|    #     #     #  |
|    #     #     #  |
|      # #         #|
|  #                |
|      # # #     #  |
|#     #     #     #|
|      # # # #      |
|_ _ # _ _ _ _ # _ _|

在这里,有大量的空间与地图的其余部分隔开。如果玩家从这些“房间”外开始,就不可能进入。如果他们在其中一个“房间”内出发,他们就出不去。我知道我可以使用洪水填充或类似的方法来测试这一点,但这意味着我必须生成新的地图,直到其中一个随机符合这些标准。我在想的是一套新的“填充”瓷砖的规则。现在我只是在每一块瓷砖中穿行,检查一个随机数是否高于阈值。如果是,请填写,如果不是,请转到下一个磁贴。但是,这意味着网格中的每个磁贴都与其他磁贴完全无关。我一直在考虑很多可以帮助我的规则集,尽管我可以把我的头脑集中在大多数规则集上。如果有人有任何建议,请告诉我预防方法

在这种方法中,不允许形成封闭空间

其中一种方法可能是使用

一个结果是封闭空间,如果

  • 不接触边界:形成一个循环
  • 带触摸边框:两个不相邻(水平或垂直)的全瓷砖,通过全瓷砖的某个路径连接,也与边框连接
因此,当您填充此网格时,对于每个被选择为完整磁贴的磁贴,使用联合查找有效地检查上述两种情况

纠正方法

在这种方法中,您可以使用一些完整的平铺随机填充网格。这种方法可能会形成封闭空间。现在,使用union find数据结构检测空间是否已关闭,以获取完整的分幅或空分幅的整体填充。如果空间已关闭,请通过清空一些完整的平铺来纠正它。要清空哪些满瓷砖?可以有多种方法。其中之一可能是清空与封闭空间相关的、接触边界或形成循环的完整瓷砖。同样,对于这个联合查找或任何与图连通性相关的算法,如BFS、DFS等,都可以使用


如果我再想办法,我会告诉你的。希望上述方法能有所帮助。

预防方法

在这种方法中,不允许形成封闭空间

其中一种方法可能是使用

一个结果是封闭空间,如果

  • 不接触边界:形成一个循环
  • 带触摸边框:两个不相邻(水平或垂直)的全瓷砖,通过全瓷砖的某个路径连接,也与边框连接
因此,当您填充此网格时,对于每个被选择为完整磁贴的磁贴,使用联合查找有效地检查上述两种情况

纠正方法

在这种方法中,您可以使用一些完整的平铺随机填充网格。这种方法可能会形成封闭空间。现在,使用union find数据结构检测空间是否已关闭,以获取完整的分幅或空分幅的整体填充。如果空间已关闭,请通过清空一些完整的平铺来纠正它。要清空哪些满瓷砖?可以有多种方法。其中之一可能是清空与封闭空间相关的、接触边界或形成循环的完整瓷砖。同样,对于这个联合查找或任何与图连通性相关的算法,如BFS、DFS等,都可以使用


如果我再想办法,我会告诉你的。希望以上内容有所帮助。

您可以遵循以下方法:

我们可以用你的分片创建一个图,分片是图的节点,如果两个分片都是填充的且相邻的,则定义边(如果你的玩家可以对角移动,则对角是可选的)。 若要支撑边,请将栅格设为12*12并填充所有边。 在此图中,当且仅当图中存在
循环时,才会隔离平铺
因此,您可以随机填充一个Tile值,并检查新图形是否仍然是
接受它,否则重新填充并转到下一个尾部。
可以使用
DFS

检查图形是否为树,您可以遵循以下方法:

我们可以用你的分片创建一个图,分片是图的节点,如果两个分片都是填充的且相邻的,则定义边(如果你的玩家可以对角移动,则对角是可选的)。 若要支撑边,请将栅格设为12*12并填充所有边。 在此图中,当且仅当图中存在
循环时,才会隔离平铺
因此,您可以随机填充一个Tile值,并检查新图形是否仍然是
接受它,否则重新填充并转到下一个尾部。
在上一个示例中,可以使用
DFS

洪水填充每个房间来检查图形是否为树型,这将提供一个可以访问所有空瓷砖的地图。为什么你认为你必须生成一个全新的随机地图,而你可以通过洪水填充适当的区域来拯救你当前的地图?发布的解决方案解决了你的问题吗?如果是。如果没有,发布的解决方案没有回答什么?我离开了一段时间,很抱歉,但是是的,我确实使用了其中一个答案的一个稍微修改的版本。在上一次考试中,每个房间都充满了洪水
 _ _ _ _ _ _ _ _ _ _
|#     #   #       #|
|    #     #     #  |
|    #     #     #  |
|      # #         #|
|  #                |
|      # # #     #  |
|#     #     #     #|
|      # # # #      |
|_ _ # _ _ _ _ # _ _|