| Автор: | Борошенко О. Д. | Ограничение времени: | 2 сек | |
| Входной файл: | test.sql | Ограничение памяти: | 256 Мб | |
| Выходной файл: | test.log |
Вы оказались в Backrooms — бесконечных комнатах, заполненных опасными сущностями. Вам нужно найти кратчайший путь к выходу, используя поиск в ширину (BFS).
База данных содержит информацию о комнатах и связях между ними. В таблице room хранятся:
В таблице connection хранятся связи между комнатами:
Ваша задача — написать SQL-запрос, который для каждого уровня найдёт комнату, с которой нужно начать путь, чтобы добраться до выхода за наименьшее количество шагов, и выведет:
Критерии выбора стартовой комнаты (в порядке приоритета):
Важно:
Отсортировать результат по номеру уровня.
Подсказка: В SQLite есть рекурсивные CTE (WITH RECURSIVE), которые позволяют реализовать BFS.
CREATE TABLE Room (
id INTEGER not null primary key,
level INTEGER not null,
x INTEGER not null,
y INTEGER not null,
room_type VARCHAR(50) not null,
is_exit INTEGER not null default 0,
is_entity INTEGER not null default 0,
entity_name VARCHAR(100)
);
CREATE TABLE Connection (
from_room_id INTEGER not null,
to_room_id INTEGER not null,
direction VARCHAR(10) not null,
is_blocked INTEGER not null default 0,
primary key (from_room_id, to_room_id),
foreign key (from_room_id) references Room(id),
foreign key (to_room_id) references Room(id)
);
Решение следует представить в виде текстового файла, содержащего единственный SQL-запрос.
Для тестовой базы корректный запрос вернёт следующее:
1|317|2|3|1|0
2|410|2|2|1|0
4|600|0|0|1|0
Предполагается, что для работы с базой данных используется SQLite3.