Здравствуйте, Nogard, Вы писали:
N>Задача:
N>На языке Prolog разработать программу обхода шахматной доски.
N>В левом нижнем углу шахматной доски 3 х 4 помещена ладья.
N>Требуется обойти ладьей доску, проходя через каждое поле ровно один раз. Последним ходом ладья должна быть установлена на одно из двух полей, соседних к исходному. Программа должна вывести маршрут движения фигуры
N>Пожалуйста, подскажите, с чего начать решение этой задачи, или, кто может, дайте решение...
Перевожу на формальный язык: "построить гамильтонов цикл на графе в виде прямоугольной сетки".
Наглое решение: нарисовать цикл на бумажке и сказать: вот же он!
*-* *-*
| | | |
* *-* *
| |
*-*-*-*
ну и на забыть про симметричные решения (в общей сложности — 4 штуки: зеркально по горизонтали и 2 направления обхода).
Тупое решение: формировать список посещённых клеток и проверять, что мы не посещаем одну клетку второй раз.
% переход к одной из соседних клеток, безотносительно пути
next((X,Y), (X1,Y1)) :- ...
% проверка границ
valid((X,Y)) :- ...
% проверка уникальности
unique(Point, []).
unique(Point, [Point|_]) :- !,fail.
unique(Point, [_|Points) :- unique(Point, Points).
% переход к следующей клетке пути
nextStep(Points, NewPoint) :-
head(Points,Point),
next(Point,NewPoint), % порождаем (здесь будет ветвление)
valid(NewPoint), unique(NewPoint,Points). % очевидные условия
% строим путь
buildPath(0, Points, Points) :- !.
buildPath(Rest, Points, FullPath) :- ...
% старт!
path(FullPath) :- buildPath(3*4-1, [(1,1)], FullPath).
Умное решение (для больших досок) — проверять, не отсекаются ли участки графа.
... << RSDN@Home 1.2.0 alpha rev. 655>>
ААА! Хватит минуса мне ставить
Признаю тупость вопроса! Пока ждал — сам написал это дело... и оно работает!!! Спасибо за стимул в виде минусов, больше не надо