Следующая функция получает двумерный массив следующим образом.
[['.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.'],
['.', '.', 'y', '.', '.', '.', '.'],
['.', '.', 'y', '.', 'r', '.', 'y'],
['.', 'r', 'r', 'y', 'r', 'y', 'r'],
['.', 'r', 'y', 'y', 'r', 'r', 'y']]
Цель функции - подсчитать количество «полос» определенного размера, которые существуют в моем 2D-массиве. Полоса определяется как последовательная линия токенов в горизонтальном, вертикальном или диагональном расположении.
Следующий пример считается за 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