Игра «Погаси свет» · Шаг 4 из 4
Подсказка
У головоломки есть старый приём — «гонка огней». Идёте по рядам сверху вниз, и под каждой горящей лампочкой щёлкаете в ряду ниже: она гаснет, а ряд выше уже не трогается. Все огни сбегаются в нижний ряд. Если и он погас — решено. Если нет — значит, верхний ряд надо было сначала нажать как-то по-другому. Вариантов верхнего ряда у поля шириной 5 всего 32 — их можно просто перебрать.
Что сделать
Найдите, по каким клеткам щёлкнуть, чтобы погасло всё: переберите нажатия верхнего ряда и догоните огни вниз.
Что приходит
pole— раскладка: список строк,"#"— горитnazhat— щелчок:nazhat(pole, stroka, stolbec)даёт новое поле
Что вернуть
Отсортированный список пар (строка, столбец) — по каким клеткам щёлкнуть; не нашлось — None.
Допишите функцию reshenie в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В игре
Игра зовёт reshenie по пробелу и подсвечивает первую клетку из вашего списка — «жмите сюда». Решите шаг — и у головоломки появится подсказка.
Без этого шага: подсказки по пробелу нет.
В образце вместо настоящего щелчка — игрушка: переключает клетку и ту, что над ней. Поле ["#.", "..", ".."]. Без нажатий верхнего ряда огонь в (0, 0) догоняется вниз и застревает в нижнем ряду. Набор «нажать (0, 0)» гасит его сразу — ответ [(0, 0)].
Пусть у поля h строк по w клеток. Переберите числа m от 0 до 2 ** w − 1 по порядку. Для каждого:
- Начните с переданного поля. Щёлкните по верхнему ряду: по клетке
(0, j)— если вmстоит битj, то естьm >> j & 1равно 1. - Догоните огни: для рядов
rот0доh − 2, в каждом слева направо — если клетка(r, c)горит, щёлкните по(r + 1, c). - Если теперь не горит ничего — верните все сделанные щелчки списком пар, отсортированным по возрастанию.
Если ни одно m не погасило поле — верните None. Каждое m начинает с переданного поля, а не с того, что осталось от прошлого.
Образцовый тест целиком
def igrushka(pole, stroka, stolbec):
# переключает клетку и ту, что над ней
novoe = []
for i, ryad in enumerate(pole):
if i in (stroka, stroka - 1):
znak = "." if ryad[stolbec] == "#" else "#"
ryad = ryad[:stolbec] + znak + ryad[stolbec + 1:]
novoe.append(ryad)
return novoe
reshenie(["#.", "..", ".."], igrushka)
[(0, 0)]
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.