переход (КлНачал, Линия, Новая_Линия),
соседние (КлНачал, КлНачал2, Новая_Линия),
not (принадлежит (КлНачал2, Недоступные)),
принадлежит (КлНачал2, Обязательные),
КолОбяз2 = КолОбяз1 – 1,
маршрут (КлНачал2, КлКонеч, [КлНачал2|Хвост], ВесМаршрута2, Новая_Линия, [КлНачал2|Недоступные], Обязательные, КолОбяз2),
ВесМаршрута1 = ВесМаршрута2 + 1.
/* ВЫВОД МАРШРУТА */
% вывод последней клетки маршрута
write_маршрут([Клетка], Линия): – линия (Линия, Список),
принадлежит (Клетка, Список), write(Клетка).
% вывод клетки без перехода
write_маршрут([Клетка, Клетка2|Хвост], Линия):-
соседние (Клетка, Клетка2, Линия),
write (Клетка,» –»),
write_маршрут([Клетка2|Хвост], Линия).
% вывод клетки c переходом
write_маршрут([Клетка, Клетка2|Хвост], Линия):-
переход (Клетка, Линия, Новая_Линия),
соседние (Клетка, Клетка2, Новая_Линия),
write (Клетка,» –»),
write_маршрут([Клетка2|Хвост], Новая_Линия).
/* ВВОД ОБЯЗАТЕЛЬНЫХ СТАНЦИЙ */
ввод_назв_обяз (0, [], []): – !.
ввод_назв_обяз (1, Обязательные, ВведенныеОбяз):-
write («Введите последнюю обязательную клетку:»),
readln(Клетка),
not (принадлежит (Клетка, ВведенныеОбяз)),
Обязательные=[Клетка],!.
ввод_назв_обяз (КолОбяз, Обязательные, ВведенныеОбяз):-
КолОбяз>1,
write («Введите обязательную клетку:»),
readln(Клетка),
not (принадлежит (Клетка, ВведенныеОбяз)),
КолОбяз2=КолОбяз-1,
ввод_назв_обяз (КолОбяз2, Обязательные2, [Клетка|ВведенныеОбяз]),
Обязательные=[Клетка|Обязательные2],!;
write («Клетка с таким названием уже была введена»),
nl,
ввод_назв_обяз (КолОбяз, Обязательные, ВведенныеОбяз).
ввод_кол_обяз(КолОбяз):-
write («Сколько обязательных клеток Вы хотите ввести:»),
readln(Строка),
str_int (Строка, КолОбяз),!;
write («Необходимо ввести целое число. Пожалуйста, повторите ввод.»),
nl,
ввод_кол_обяз(КолОбяз).
ввод_обяз (Обязательные, КолОбяз): – ввод_кол_обяз(КолОбяз), ввод_назв_обяз (КолОбяз, Обязательные, []).
/* ЗАПУСК ПРОГРАММЫ */
run: – write («Выбор маршрута передвижения в лабиринте с посещением обязательных клеток»), nl,
write («Схему лабиринта можно найти в приложении пояснительной записки»), nl,
write («Введите название начальной клетки =»), readln(КлНачал),
write («Введите название конечной клетки =»), readln(КлКонеч),
ввод_обяз (Обязательные, КолОбяз),
findall (ВесМаршрута, маршрут (КлНачал, КлКонеч,_, ВесМаршрута,_, [КлНачал], Обязательные, КолОбяз), СписокВесМаршрута),
мин (ВесМаршрута, СписокВесМаршрута),
маршрут (КлНачал, КлКонеч, Маршрут, ВесМаршрута,_, [КлНачал], Обязательные, КолОбяз),
write («Оптимальный маршрут:»), nl,
write_маршрут (Маршрут,_), nl,
КолСт=round(ВесМаршрута),
write («Количество шагов:», КолСт), nl.
GOAL
run.
Приложение
Схема использованного в программе лабиринта
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
A | X | X | |||||
B | X | ||||||
C | X | X | X | X | |||
D | X | ||||||
E | X | X | |||||
F | X | X | X | X | X | ||
G | |||||||
H | X |