python - 最大的森林(亚马逊面试题)

标签 python algorithm recursion flood-fill

每个单元格要么是水“W”,要么是树“T”。给定有关该字段的信息,打印最大森林的大小。森林的大小是其中树木的数量。为清楚起见,请参阅示例案例

输入:

第一行包含矩阵 N 的大小。 接下来的 N 行每行包含 N 个字符,'W' 或 'T'。

输出:

打印最大森林的大小。

示例输入:

5
TTTWW
TWWTT
TWWTT
TWTTT
WWTTT

预期输出:10

我的代码:

t_cases = int(input())
k1 = 0
k2 = 0
for _ in range(t_cases):
    list1 = (input())
    z = 0
    list2 = []
    for i in range(len(list1)):
        z = list1.count('T')
        if list1[i] == "W":
            break
        elif list1[i] == "T":
            list2.append(list1[i])
            
    k1 = k1 + list2.count('T')
    if z > list2.count('T'):
        k2 = k2 + (z - list2.count('T'))
    else: 
        k2 = k2 + (list2.count('T')- z)
if k1 > k2:
    print(k1)
else: 
    print(k2)

我的代码满足示例输入但未能通过每个测试用例。此代码计算所有情况下“W”之前的 tress 之和,并将它们添加到 k1。同样,k2是'W'之后所有树的总和。

注意:也可以使用递归!

最佳答案

这本质上是经典flood-fill algorithm伪装。对于您看到的每棵树,您都可以运行泛洪填充以查找同一森林中的所有树,然后您只需从那里返回找到的最大树数。

一种进行泛洪填充的方法是使用 breadth-first search .这是一些简单的伪代码;我将把翻译留作练习,因为这是一道面试练习题。

max_forest = 0
for each location:
    if it's a tree, and you haven't visited it yet:
        max_forest = max(max_forest, size_of_forest(location))
return max_forest

size_of_forest(location):
    if this location has been visited already, return 0
    make a worklist of locations, initially just the start.
    
    size = 1
    while the worklist isn't empty:
        remove one element from the worklist.
        increment size.

        for each neighboring tree:
            if that location isn't yet visited:
                mark that location visited.
                increment size.
                add the location to the worklist.

        return size

另一种方法是使用 depth-first search .这是一些伪代码:

size_of_forest(location):
    if this location is visited, return 0
    mark this location as visited

    result = 0
    for each neighboring tree:
        result += size_of_forest(that tree)

    return result

要将其转化为工作代码,您需要解决大量问题。您将如何跟踪访问过哪些位置?您将如何遍历相邻的树?

更抽象一点,这个问题相当于求最大的connected component的大小通过每棵树有一个节点而形成的图,当它们彼此相邻时树之间有边。我在这里给出的 BFS 和 DFS 伪代码是通用的 BFS 和 DFS 算法,专门针对这种特殊情况。

这两种算法 - BFS 和 DFS - 非常适合您在外出面试时了解。它们在实践中一直出现,一旦您知道如何使用它们,它们就是真正的主力军。 (我已经记不清我需要编写这些代码多少次了!)

关于python - 最大的森林(亚马逊面试题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63836036/

相关文章:

python - 具有组条件的 Pandas 自定义聚合函数,可能吗?

java - 递归检查是否可能将数组拆分为满足特定条件的两个数组

python - 记住Python方法中的单个参数

java - 难以理解神经网络中的反向传播算法

c++ - 查找倍数为 N 的连续数字序列

java - 如何在Java中使用递归来解决非负子集和?

python - Marshmallow Parent Schema - 如何在子模式之间共享验证装饰器?

python - 如何将 'using' DB 传递给 django 连接对象

python - 使用无服务器框架将库/依赖项注入(inject) AWS Lambda

java - j2ME 最快的 Dijkstra 算法