首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归帮助-找到在2D数组中看到的最大花数

递归帮助-找到在2D数组中看到的最大花数
EN

Stack Overflow用户
提问于 2022-04-09 02:31:37
回答 1查看 82关注 0票数 0

我有一个编码挑战问题,我有点被困住了。问题案文如下:

访问虚拟庄园的

游客对您虚拟花园的美丽和辉煌感到惊讶,但正在寻找最佳游览地点的指导,以查看其富丽堂皇。

作为管理员,您的下一个任务是生成一个新的花园构图的文本布局,用星号(*)标注访问花园的最佳位置。

最好的位置是“空白地带”,游客可以看到每个主要方向(北、南、东、西)最多的花。当然,游客不能透过墙壁观看。如果有多个位置可以看到相同数量的花,您的文本布局应该标记所有这些位置。如果花园里没有花,所有的空地都应该标出是理想的。例如,考虑到花园的组成

这个问题涉及在二维数组中设置一个花和墙的花园,并提供一种修改矩阵的方法,以插入一个星号作为与大多数花相交的标志。

B-空白F-花W-墙

输入:

代码语言:javascript
运行
复制
B B B B B
B B F B B
B B B B B
B B F B B
B B F B B

预期产出:

代码语言:javascript
运行
复制
B B * B B
B B F B B - Flower 1
B B * B B
B B F B B - Flower 2
B B F B B - Flower 3

Where the two asterisks represent the only positions in the garden where a visitor 
can see 3 flowers by looking north, south, east and west

我最初的想法是遍历2D数组中的每个项目,并对空白("B")的每个序列执行DFS,以获得当前空白位置的基数(即北、南、东和西)所看到的花数。在python注意到我的最大递归深度被超过了,并且还没有能够在分配星号方面取得进展时,我陷入了困境。有什么想法吗?

代码语言:javascript
运行
复制
garden = [['B', 'B', 'B', 'B', 'B'], ['B', 'B', 'F', 'B', 'B'], ['B', 'B', 'B', 'B', 'B'], ['B', 'B', 'F', 'B', 'B'], ['F', 'B', 'F', 'B', 'B']]

class Solution:
    def count(self, garden):
        maxSeenFlowers = 0

        for row in range(len(garden)):
            for col in range(len(garden[0])):
                if garden[row][col] == "B":
                    self.dfs(garden, maxSeenFlowers, row, col)
                    garden[row][col] = self.maxSeenFlowers
        print(garden)

    def dfs(self,garden,maxSeenFlowers, row, col):
        self.maxSeenFlowers = 0

        if row < 0 or col < 0 or row == len(garden) or col == len(garden[0]) or garden[row][col] == "W":
            return
        if garden[row][col] == "F":
            self.maxSeenFlowers += 1
        
        self.dfs(garden,maxSeenFlowers, row+1, col) # look to the east
        self.dfs(garden,maxSeenFlowers, row-1, col) # look to the west
        self.dfs(garden,maxSeenFlowers, row, col+1) # look to the north
        self.dfs(garden,maxSeenFlowers, row, col-1) # look to the south

    
plot1 = Solution()
plot1.count(garden)

编辑:这是代码的摘录,我用它来和每个基数方向的所有值。谢谢@brokenbenchmark:

代码语言:javascript
运行
复制
    def bestSeen(self):
    gardenScore = [[0 for i in range(len(self.garden[0]))] for j in range(len(self.garden))]
    # print(gardenScore)
    maxSeen = 0

    
    # from left to right.
    for i in range(len(self.garden)):
        row_hits = 0 
        for j in range(len(self.garden[0])):
            if self.garden[i][j] == 'F':
                row_hits += 1
            elif self.garden[i][j] == 'W':
                row_hits = 0 
            else:
                gardenScore[i][j] = row_hits 
    # print(gardenScore)

    # from right to left
    for i in range(len(self.garden)):
        row_hits = 0 
        for j in range(len(self.garden[0])-1, -1, -1):
            if self.garden[i][j] == 'F':
                row_hits += 1
            elif self.garden[i][j] == 'W':
                row_hits = 0 
            else:
                gardenScore[i][j] += row_hits 
    # print(gardenScore)

    # from bottom to top
    for i in range(len(self.garden[0])):
        col_hits = 0 
        for j in range(len(self.garden)):
            if self.garden[j][i] == 'F':
                col_hits += 1
            elif self.garden[j][i] == 'W':
                col_hits = 0 
            else:
                gardenScore[j][i] += col_hits 
    # print(gardenScore)

    # from top to bottom
    for i in range(len(self.garden[0])):
        col_hits = 0 
        for j in range(len(self.garden)-1, -1, -1):
            if self.garden[j][i] == 'F':
                col_hits += 1
            elif self.garden[j][i] == 'W':
                col_hits = 0 
            else:
                gardenScore[j][i] += col_hits 
                maxSeen = max(maxSeen, gardenScore[j][i])
    # print(gardenScore)

    for i in range(len(self.garden)):
        for j in range(len(self.garden[0])):
            if gardenScore[i][j] == maxSeen:
                self.garden[i][j] = "*"
    print(self.garden)
EN

回答 1

Stack Overflow用户

发布于 2022-04-09 05:15:35

增加最大递归深度(警告!)

我陷入了困境,因为python注意到,我的最大递归深度已经超过了,并且无法在分配星号方面取得进展。有什么想法吗?

实际上,有一种方法可以增加python中的递归限制。

默认情况下,Python中的最大递归限制为1000。

在解释如何提高递归限制之前

有几件事你应该知道!

没有递归限制的

  • 递归函数可以无限期地调用自己。换句话说,您可能会有一个没完没了的循环。
  • 也可能会发生堆栈溢出错误,即使递归不是无限的。这可能是由于堆栈帧太大而导致的。
  • 在Python中,递归限制将这些风险从方程中剔除。

我不建议增加递归。

而是尝试迭代实现您的算法,以避免深入的递归。

增加最大递归深度限制的代码

代码语言:javascript
运行
复制
import sys

#See current recursion limit by calling sys.getrecursionlimit()
print(sys.getrecursionlimit()) #(default = 1000)

print(sys.setrecursionlimit(2000)) # Sets the limit to 2000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71804841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档