Смекни!
smekni.com

Программа выбора оптимального (наикратчайшего) маршрута перемещения в лабиринте (стр. 2 из 2)

переход (КлНачал, Линия, Новая_Линия),

соседние (КлНачал, КлНачал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