Проверка чисел в матрице. python
На вход программе подается двумерный список размерностью 5 х 5 элементов, состоящий из нулей и в некоторых позициях единицы. Требуется проверить, не касаются ли единицы друг друга по горизонтали, вертикали и диагонали. То есть, вокруг каждой единицы должны быть нули. Если проверка проходит вывести на экран "ДА", иначе "НЕТ".
мне нейросеть предложила такой вариант решения моей задачи. но как бы я не задавал вопрос, желаемого ответа так и не получил.
def check_matrix(matrix):
# Размер матрицы
n = len(matrix)
# Функция для проверки соседних элементов
def is_isolated(i, j):
# Проверяем все соседние ячейки
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
# Пропускаем саму ячейку
if di == 0 and dj == 0:
continue
# Координаты соседней ячейки
ni, nj = i + di, j + dj
# Проверяем границы матрицы и наличие единицы в соседней ячейке
if 0 <= ni < n and 0 <= nj < n and matrix[ni][nj] == 1:
return False
return True
# Проходим по всей матрице
for i in range(n):
for j in range(n):
# Если нашли единицу, проверяем ее окружение
if matrix[i][j] == 1:
if not is_isolated(i, j):
return "НЕТ"
return "ДА"
# Пример использования
matrix = [
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
print(check_matrix(matrix))
for di in [-1, 0, 1]:
for dj in [-1, 0, 1]:
что значит эта строка, и какое отношение она имеет к i и j?
Нет нужды делать проверку всех соседей элемента - раз мы итерируем по всей матрице с начала и до конца, то достаточно проверять элемент справа, снизу и вправо вниз и вправо вверх по диагонали. Можно делать проверку на границу матрицы, а можно, например, сначала добавить нулевых элементов справа и снизу (padding), и обойтись без проверки граничных значений. как-то так:
def check_m(matrix: list)-> bool:
w = len(matrix[0])
h = len(matrix)
matrix.append([0 for x in range(h)])
for x in matrix:
x+=[0]
for i in range(w):
for j in range(h):
if matrix[i][j]==1:
if matrix[i+1][j]==1 or matrix[i][j+1]==1 or matrix[i+1][j+1]==1 or matrix[i+1][j-1]:
return False
return True
print(check_m(matrix))