Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/129.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_Recursion_Artificial Intelligence_Dynamic Programming_Backtracking - Fatal编程技术网

Algorithm 找到占用网格的最短时间

Algorithm 找到占用网格的最短时间,algorithm,recursion,artificial-intelligence,dynamic-programming,backtracking,Algorithm,Recursion,Artificial Intelligence,Dynamic Programming,Backtracking,问题: 考虑一个病人皮肤感染和细菌蔓延迅速。假设蒙皮曲面缩放为大小为MxN的矩形网格,单元格由0和1标记,其中0表示蒙皮上的非受影响区域,1表示蒙皮上的受影响区域。细菌可以在4个可能的方向(右、左、上、下)从网格的一个细胞移动到另一个细胞,但在一个方向上一次只能移动到一个细胞,并在1秒内影响该细胞。目前正在治疗患者的医生看到了患者的状况,并想知道在细菌蔓延到全身皮肤和患者死亡之前,他还有多少时间可以拯救他。你能帮助估计细菌完全占据皮肤表面所需的最短时间吗 输入::皮肤的当前状态。(尺寸为MxN的

问题: 考虑一个病人皮肤感染和细菌蔓延迅速。假设蒙皮曲面缩放为大小为MxN的矩形网格,单元格由0和1标记,其中0表示蒙皮上的非受影响区域,1表示蒙皮上的受影响区域。细菌可以在4个可能的方向(右、左、上、下)从网格的一个细胞移动到另一个细胞,但在一个方向上一次只能移动到一个细胞,并在1秒内影响该细胞。目前正在治疗患者的医生看到了患者的状况,并想知道在细菌蔓延到全身皮肤和患者死亡之前,他还有多少时间可以拯救他。你能帮助估计细菌完全占据皮肤表面所需的最短时间吗

输入::皮肤的当前状态。(尺寸为MxN的矩阵,带有1和0,表示受影响和非受影响区域)

输出::覆盖整个网格的最小时间(秒)

示例:

输入:

[1 10 0 1]
[0110]
[01]
[011000]

输出:2秒

说明:

输入1秒后,矩阵可能如下所示

[1 10 1]
[1 10 1]
[01101]
[01101]

在下一秒,矩阵被1完全填充


这里我不会给出一个详细的解决方案,但是一些想法可能会帮助您编写自己的程序

  • 第一步是确定要实现的算法类型。最佳方法是为这个问题找到一个简单而快速的临时解决方案。在没有这样的解决方案的情况下,对于这类问题,经典的候选者是DFS、BFS、a*
  • 因为目标是寻找最短的解决方案,所以首先考虑BFS是自然的,一旦BFS找到一个解决方案,我们知道它是最短的,并且我们可以停止搜索。然而,我们必须考虑避免节点的膨胀,因为它不仅会导致巨大的计算时间,而且会产生巨大的内存。
  • 避免节点膨胀的第一个想法是考虑一些<代码> 1 < /Cord>单元格只能在另一个单元格中扩展。例如,在张贴的图表中,单元格(0,0)(左上角)只能扩展到单元格(1,0)。然后,在此扩展之后,单元(1,1)只能移动到单元(2,1)。因此,我们知道将单元(1,1)移动到单元(1,0)是次优的。因此:首先移动这些单元

    以类似的方式,一旦被感染的细胞被其他感染细胞包围,就不再需要为下一个动作考虑它。

    最后,可以方便地列出受感染细胞的列表,以及每个细胞可以移动到的未受感染细胞的数量

  • 限制节点数量的另一个想法是检测重复节点,因为这里可能存在许多重复节点。为此,我们必须定义一种散列。所使用的哈希函数不需要100%有效,但需要快速计算,如果可能,还需要以递归方式计算。如果我们通过在(i,j)位置添加一个1-单元从图中获得B图,那么我建议如下

    H(B)=H(A)^f(i,j)

    f(i,j)=a*(1024*i+j)%b

  • 这里,我使用了N和M小于1000的事实


    每次计算一个新的图时,我们必须计算相应的H值,并检查它是否已经存在于过去的图集中。 这里我将不提供详细的解决方案,但一些想法有望帮助您编写自己的程序

  • 第一步是确定要实现的算法类型。最佳方法是为这个问题找到一个简单而快速的临时解决方案。在没有这样的解决方案的情况下,对于这类问题,经典的候选者是DFS、BFS、a*
  • 因为目标是寻找最短的解决方案,所以首先考虑BFS是自然的,一旦BFS找到一个解决方案,我们知道它是最短的,并且我们可以停止搜索。然而,我们必须考虑避免节点的膨胀,因为它不仅会导致巨大的计算时间,而且会产生巨大的内存。
  • 避免节点膨胀的第一个想法是考虑一些<代码> 1 < /Cord>单元格只能在另一个单元格中扩展。例如,在张贴的图表中,单元格(0,0)(左上角)只能扩展到单元格(1,0)。然后,在此扩展之后,单元(1,1)只能移动到单元(2,1)。因此,我们知道将单元(1,1)移动到单元(1,0)是次优的。因此:首先移动这些单元

    以类似的方式,一旦被感染的细胞被其他感染细胞包围,就不再需要为下一个动作考虑它。

    最后,可以方便地列出受感染细胞的列表,以及每个细胞可以移动到的未受感染细胞的数量

  • 限制节点数量的另一个想法是检测重复节点,因为这里可能存在许多重复节点。为此,我们必须定义一种散列。所使用的哈希函数不需要100%有效,但需要快速计算,如果可能,还需要以递归方式计算。如果我们通过在(i,j)位置添加一个1-单元从图中获得B图,那么我建议如下

    H(B)=H(A)^f(i,j)

    f(i,j)=a*(1024*i+j)%b

  • 这里,我使用了N和M小于1000的事实


    每次计算一个新的图时,我们必须计算相应的H值,并检查它是否已经存在于过去的图集中。 我不知道在面试的情况下,我能做到什么程度。经过一些思考,而不是考虑存储一个以上的全板状态的解决方案,我宁愿考虑贪婪优先队列,因为下一个零单元的强启发式算法。
    e.g., choose A over B
    
    1 1 B 0 1
    0 1 1 0 0
    0 0 A 0 1
    0 1 0 0 0
    
    e.g., choose A over B
    
    1 1 1 0 1
    1 B 1 0 A
    0 0 0 0 1
    0 1 0 0 0