python - Python扫雷递归算法超出递归限制
问题描述
我正在尝试使用 Python 数组制作扫雷,并成功生成了棋盘和炸弹。但是,我对扫雷的“零递归”有困难。如果您在扫雷中选择 0,它将显示所有相邻的图块,如果任何相邻的图块为 0,它将显示所有与该 0 相邻的图块,依此类推。最终,显示的牌的边缘不能有 0,因为所有与显示为 0 的相邻牌都将被显示。我的递归算法超过了 python 的最大递归深度。这是代码:
def zero():
for y in range(height):
for x in range(width-1):
if hidden[y][x] == 0 and (hidden[y+1][x] == '?' or hidden[y-1][x] == '?' or hidden[y+1][x+1] == '?' or hidden[y-1][x-1] == '?' or hidden[y+1][x-1] == '?' or hidden[y-1][x+1] == '?' or hidden[y][x+1] == '?' or hidden[y][x-1] == '?'):
if y+1 < height:
hidden[y+1][x] = board[y+1][x]
if y-1 >= 0:
hidden[y-1][x] = board[y-1][x]
if y+1 < height and x+1 < width:
hidden[y+1][x+1] = board[y+1][x+1]
if y-1 >= 0 and x+1 < width:
hidden[y-1][x+1] = board[y-1][x+1]
if y-1 >= 0 and x-1 >= 0:
hidden[y-1][x-1] = board[y-1][x-1]
if x+1 < width:
hidden[y][x+1] = board[y][x+1]
if x-1 >= 0:
hidden[y][x-1] = board[y][x-1]
if y+1 < height and x-1 >= 0:
hidden[y+1][x-1] = board[y+1][x-1]
zero()
代码检查数组中是否有任何隐藏的相邻块显示零。(隐藏的瓷砖用“?”表示)。如果有任何符合这些参数的零,则将显示所有与零相邻的瓷砖。然后它重新启动该功能。一旦整个数组中没有满足参数的零,函数循环就会被打破,代码将继续流动。这超出了递归限制。有什么建议么?
解决方案
您的测试'?'
不受板外索引的保护。在低指数边缘,这会产生环绕的负指数。但是,清除s的代码'?'
会检查它的索引,所以任何交叉边缘 0-? 对持续存在和无限递归结果。
在电路板的高索引边缘,读取会失败IndexError
(假设没有填充“幽灵单元”),但算法当然会因其搜索顺序而偏向较小的索引,因此它通常不会走那么远。
推荐阅读
- python - ERROR: Exit status 1, PySimpleGui - new to python
- javascript - What am I doing wrong? Updating a variable through a function
- python - Julia 匿名函数和性能
- selenium - 如何在使用 selenium 加载更多内容后重置滚动顶部
- sql - SQL Server SQL 执行历史
- android - snap "flutter" 的这个修订版是使用经典约束发布的
- arrays - PowerShell ForEach 循环将 UserPrincipalName 和对象 ID 添加到文件
- algorithm - 二叉树的最大高度与二叉树的高度
- python - Python:将先前抓取的数据保存在数据库中(已创建)
- flutter - 将列表布尔值转换为列表字符串颤动