python - 如何更有效地检查游戏板上的条纹?
问题描述
下面的函数像这样接收一个二维数组。
[['.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.'],
['.', '.', 'y', '.', '.', '.', '.'],
['.', '.', 'y', '.', 'r', '.', 'y'],
['.', 'r', 'r', 'y', 'r', 'y', 'r'],
['.', 'r', 'y', 'y', 'r', 'r', 'y']]
该函数的目的是计算我的二维数组中存在的指定大小的“条纹”的数量。条纹被定义为以水平、垂直或对角线排列的连续标记线。
以下示例计为 1 个大小为 2 的条纹。
[['.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.'],
['.', '.', 'r', '.', '.', '.', '.'],
['.', 'r', '.', '.', '.', '.', '.']]
下面的代码片段是我的蛮力解决方案,它通过了板的每个组合。我可以使用更有效的解决方案/算法吗?
def streaks(num_repeats, board, player_color):
reduced_range = num_repeats - 1
list_idx_offsets = list(range(0, num_repeats))
counter = 0
# Checks rows
for col in range(0, COLUMN_COUNT - reduced_range):
for row in range(0, ROW_COUNT):
list_results = []
for idx in list_idx_offsets:
list_results.append(board[row][col + idx])
# If the list is identical and the player is in the list, then increment counter
if list_els_identical(list_results) and player_color in list_results:
counter += 1
# Checks columns
for col in range(0, COLUMN_COUNT):
for row in range(0, ROW_COUNT - reduced_range):
list_results = []
for idx in list_idx_offsets:
list_results.append(board[row + idx][col])
if list_els_identical(list_results) and player_color in list_results:
counter += 1
# Check diagonals positive
for col in range(0, COLUMN_COUNT - reduced_range):
for row in range(0, ROW_COUNT - reduced_range):
list_results = []
for idx in list_idx_offsets:
list_results.append(board[row + idx][col + idx])
if list_els_identical(list_results) and player_color in list_results:
counter += 1
# Check diagonals negative
for col in range(0, COLUMN_COUNT - reduced_range):
for row in range(reduced_range, ROW_COUNT):
list_results = []
for idx in list_idx_offsets:
list_results.append(board[row - idx][col + idx])
if list_els_identical(list_results) and player_color in list_results:
counter += 1
return counter
解决方案
实地考察一次(按等级或按文件)
对于每个字段,检查是否有条纹(通过查看相邻字段;如果它具有相同的符号,则在相同方向上超出它的字段等)但仅“向前”:在一半方向上,即您拥有字段的方向还没走过去还躺着。
例如,当按行列行走时,这将是:********** ****X----- .../|\.... ../.|.\... ./..|..\..
- 将任何发现的条纹保存到结果中
- 为每个字段创建一个标志矩阵,表示您已经从该字段中查找了这四个方向中的哪些方向
- 从字段中查找条纹时,对于您查看的具有相同符号的每个字段,适当地填充上述标志(对于当前单元格,也以相同的方式填充标志)。当最终走过那个领域时,不要再看那些方向。
- 这将保证您在结果中只有完整的条纹,而不是它们的部分。
- 最后,所有字段都将设置所有标志。您可以将此作为调试断言进行检查(如果未设置所有标志,则您无法从相应字段中检查相应方向)。
推荐阅读
- flutter - 如何使用主题小部件使用字体设置?
- java - 如何更改 Firebase 中的数据并检查 id 自动增量
- functional-programming - 如何直接将 val 绑定到 SML 中的选项值?
- xamarin.forms - 更新 ListView 的 ObservableCollection 中一项的显示
- google-sheets - 使用 HLOOKUP 根据 2 个条件查找值
- gpu - 在 Ubuntu 18.04 上使用 GPU 进行 PyTorch 对象检测 - RuntimeError: CUDA out of memory。试图分配 xx.xx MiB
- windows - 在未登录的情况下在启动时运行 Powershell 脚本
- python - Python正则表达式查找器进入字典
- javascript - 如何根据可观察 RxJs 的响应修改数组中的对象
- machine-learning - 如何确定深度学习中嵌入、LSTM、层中的单元数量