Разбор задач. Спецификация ввода-вывода. Множественное тестирование
os.system(): циклический запуск программ-генераторов входных данных и решателей
- Спецификация ввода и вывода в олимпиадных задачах
Домашнее задание
Написать три вида генераторов входных данных для задачи «лабиринт»:
- «Простой» (случайная установка стен в пустом лабиринте)
- Подобрать такую долю стен, чтобы в половине случаев лабиринт был проходим, а в половине — нет (предположительно 66%)
Случайный с «комнатами и колоннами». Лабиринт заполняется по схеме: · — всегда свободное место («комната»), # — всегда непроходимое место («колонна»), × — место, которое может быть проходимым, а может и нет («стена»):
·×·×·×· ×#×#×#× ·×·×·×· ×#×#×#× ·×·×·×·
- С комнатми и колоннами по следующему алгоритму
Заполняем всё "#" (тем самым помечаем комнаты «неизведанными», а стены «непрорубленными»), кроме комнаты-входа. Помещаем комнату-вход в план разведки (список комнат, требующих разведки их соседей).
- Цикл до тех пор, пока план разведки не пуст.
- Выбираем последнюю комнату в плане разведки («исследуемую»)
- Если у неё нет неизведанных соседей, выбрасываем эту комнату из плана разведки и переходим к новому витку цикла
- Случайно выбираем одного из неизведанных соседей исследуемой комнаты («новую»)
Заполняем "." (проходами) новую комнату и стену между ней и исследуемой
- Добавляем этого соседа в план разведки.
Как изменится внешний вид лабиринта, если в п. 1.1 вместо последней выбирать случайную комнату из плана разведки?
Для того, чтобы сгенерировать непроходимый лабиринт, достаточно в п. 0. добавить в план разведки и вход, и выход! Почему? Реализовать генератор непроходимого или проходимого лабиринта (в зависимости от случайности или по запросу).
- «Простой» (случайная установка стен в пустом лабиринте)
Условные обозначения
— тема по Linux
— необязательная тема
— теоретическое задание
— тема для самостоятельного изучения