Для строк вы можете сохранить счетчик, который указывает, сколько одинаковых элементов в строке у вас есть в данный момент. Для этого выполните итерацию по строке и
- , если текущий элемент соответствует предыдущему элементу, увеличить счетчик на единицу. Если счетчик равен 5, то вы нашли 5 элементов, которые хотели.
- если текущий элемент не соответствует предыдущему элементу, установите счетчик на 1.
Тот же принцип применим и к колоннам и диагоналям. Возможно, вы захотите использовать массив счетчиков для столбцов (по одному элементу для каждого столбца) и диагоналей, чтобы можно было выполнить итерацию по матрице один раз.
Я сделал небольшой пример для меньшего случая, но вы можете легко изменить его:
n = 3
matrix = [[1, 2, 3, 4],
[1, 2, 3, 1],
[2, 3, 1, 3],
[2, 1, 4, 2]]
col_counter = [1, 1, 1, 1]
for row in range(0, len(matrix)):
row_counter = 1
for col in range(0, len(matrix[row])):
current_element = matrix[row][col]
# check elements in a same row
if col > 0:
previous_element = matrix[row][col - 1]
if current_element == previous_element:
row_counter = row_counter + 1
if row_counter == n:
print n, 'in a row at:', row, col - n + 1
else:
row_counter = 1
# check elements in a same column
if row > 0:
previous_element = matrix[row - 1][col]
if current_element == previous_element:
col_counter[col] = col_counter[col] + 1;
if col_counter[col] == n:
print n, 'in a column at:', row - n + 1, col
else:
col_counter[col] = 1
Я оставил диагонали, чтобы пример был коротким и простым, но для диагоналей вы можете использовать тот же принцип, что и для столбцов. Предыдущий элемент будет одним из следующих (в зависимости от направления диагонали):
matrix[row - 1][col - 1]
matrix[row - 1][col + 1]
Обратите внимание, что вам нужно будет приложить немного дополнительных усилий во втором случае. Например, пройти строку во внутреннем цикле справа налево.