Algorithm 无限时间后求矩阵中水的算法

Algorithm 无限时间后求矩阵中水的算法,algorithm,matrix,data-structures,Algorithm,Matrix,Data Structures,给出了由水(W)、草(G)和块(B)组成的二维矩阵作为输入 外汇:给出了一个4*4矩阵 W G W G B G B G G G B G W G G G 每过一个单位的时间,水流向所有四个方向(如果没有堵塞)。最初假设时间=0 时间=1个单位后,矩阵如下所示 W W W W B G B G W G B G W W G G 假设你有无限的时间,这个矩阵是什么样子的。 对于这个输入矩阵,我们必须在无限时间后打印时间矩阵 输出: 0 1 0 1 -1 2 -1 2 1

给出了由水(W)、草(G)和块(B)组成的二维矩阵作为输入

外汇:给出了一个4*4矩阵

W G W G   
B G B G
G G B G
W G G G
每过一个单位的时间,水流向所有四个方向(如果没有堵塞)。最初假设时间=0

时间=1个单位后,矩阵如下所示

W W W W    
B G B G   
W G B G      
W W G G
假设你有无限的时间,这个矩阵是什么样子的。 对于这个输入矩阵,我们必须在无限时间后打印时间矩阵

输出:

0 1 0 1
-1 2 -1 2
1 2 -1 3
0 1 2 3
此处0表示在t=0时最初存在的水。和 1、2、3分别表示t=1、2和3个单位后到达的水

该问题是在SDE-1简介的面试过程中提出的

我的做法: 遍历二维数组并检查草,无论我们在哪里找到草,递归遍历所有四个方向,直到找到水、块或边界。 最坏情况下的时间复杂度:O(n^4),因为我们首先需要遍历二维数组,然后,我们在每4个方向递归调用


有没有比n^4更好的方法?另外,我可以从面试的角度练习这些问题

您可以使用来自多个来源的简单BFS(这将是您的初始水源),并找到最短的距离。那将花费你O(n^2)时间

让BFS排队,每次初始加水。将这些问题的答案设置为0。同时将所有模块的答案设置为-1。然后,当队列不为空时,重复:

  • 从队列顶部获取节点u
  • 对于每个相邻v(本例中为4侧):
    • 如果v是block,则忽略
    • 如果已经访问了v,请忽略
    • 将ans[v]设置为ans[u]+1,将v设置为已访问,并将v添加到队列中

您可以使用洪水填充算法。洪水填充算法将实现我上面提到的功能。我需要降低问题的时间复杂性。我弄错了吗?不,floodfill最多需要*O(n^2),因为您只需跟踪已填充的项目。它的行为有点像Dijkstra。但是有多个源,每个顶点正好有四个邻居。谢谢你的建议。需要更多的澄清,这个最短的距离将采取O(n^2)本身。对所有多个源执行此操作需要O(n^4)个BFS访问每个节点一次并找到离它最近的距离。您有O(n^2)个节点,因此需要O(n^2)个时间。明白了。非常感谢。谢谢你的建议。我现在正在考虑TopCoder和InterviewBit。