[Turbo Prolog]Обход ладьей поля
От: Nogard Россия  
Дата: 22.04.07 22:02
Оценка:
Задача:
На языке Prolog разработать программу обхода шахматной доски.
В левом нижнем углу шахматной доски 3 х 4 помещена ладья.
Требуется обойти ладьей доску, проходя через каждое поле ровно один раз. Последним ходом ладья должна быть установлена на одно из двух полей, соседних к исходному. Программа должна вывести маршрут движения фигуры

Пожалуйста, подскажите, с чего начать решение этой задачи, или, кто может, дайте решение...

Заранее спасибо!!!
Re: [Turbo Prolog]Обход ладьей поля
От: Кодт Россия  
Дата: 23.04.07 09:12
Оценка: 9 (1)
Здравствуйте, 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>>
Перекуём баги на фичи!
Re[2]: [Turbo Prolog]Обход ладьей поля
От: Nogard Россия  
Дата: 30.04.07 20:24
Оценка: -3 :)))
Здравствуйте, Кодт!!
Спасибо огромное за помощь, но я в Prolog не шарю совсем, а надо сдать лабу по этому делу... не могли бы вы привести полный код программы, пожалуйста! (для Вас это особого труда не составит)?
Еще раз огромное Вам спасибо!
Re[3]: [Turbo Prolog]Обход ладьей поля
От: Nogard Россия  
Дата: 01.05.07 12:40
Оценка: +1 :))) :)
ААА! Хватит минуса мне ставить Признаю тупость вопроса! Пока ждал — сам написал это дело... и оно работает!!! Спасибо за стимул в виде минусов, больше не надо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.