Помогите с объяснением решения задачи

Объясните, пожалуйста, подробно решение этой задачи

Задача "Кинотеатр"

В кинотеатре n рядов по m мест в каждом. В двумерном массиве хранится информация о проданных билетах, число 1 означает, что билет на данное место уже продано, число 0 означает, что место свободно. Поступил запрос на продажу k билетов на соседние места в одном ряду. Определите, можно ли выполнить такой запрос.

Входные данные Программа получает на вход числа n и m. Далее идет n строк, содержащих m чисел (0 или 1), разделенных пробелами. Затем дано число k.

Выходные данные Программа должна вывести номер ряда, в котором есть k подряд идущих свободных мест. Если таких рядов несколько, то выведите номер наименьшего подходящего ряда. Если подходящего ряда нет, выведите число 0.

Выходные данные Программа должна вывести номер ряда, в котором есть k подряд идущих свободных мест. Если таких рядов несколько, то выведите номер наименьшего подходящего ряда. Если подходящего ряда нет, выведите число 0.

введите сюда описание изображения

Решение которое нужно подробно объяснить:

n, m = map(int, input().split())
rows = [input() for _ in range(n)]
k = int(input())

pat = ' '.join('0' * k)
row = next((i+1 for i, line in enumerate(rows) if pat in line), 0)

print(row)

Ответы (1 шт):

Автор решения: Zhihar

получаем размер кинотеатра

n, m = map(int, input().split())

формируем матрицу заполнения кинотеатра - т.е. список строк, содержащих статусы мест ряда

rows = [input() for _ in range(n)]

получаем кол-во билетов (свободных мест) в ряду

k = int(input())

формируем строку, содержащую статус свободных мест

pat = ' '.join('0' * k)

т.е. для k = 3 будет pat = '0 0 0'

а дальше в сформированных ранее рядах (состояниях мест) ищем встречается ли сформированная нами строка pat

row = next((i+1 for i, line in enumerate(rows) if pat in line), 0)

для этого список рядов превращаем в список кортежей (номер ряда, ряд)

enumerate(rows) 

и проверяем входит ли в ряд (строку) сформированные пустые места (строка)

if pat in line

на выходе у нам получается список номеров рядов (начиная с 1, для чего делается i + 1 ибо счет рядов идёт с 0)

ну и на выходе выбираем первый найденный ряд

→ Ссылка