Algorithm 无限时间后求矩阵中水的算法
给出了由水(W)、草(G)和块(B)组成的二维矩阵作为输入 外汇:给出了一个4*4矩阵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 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添加到队列中