SWI-Prolog, Шахматная задача, Конь

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Столкнулся с "классической" задачей, о которой все говорят которую все знают, но упорно прячут решение. Итак: Задача о конях. Задача состоит в отыскании всех расстановок максимально возможного количества коней на пустой шахматной доске (NxN), таких, в которых ни один из коней не находится под боем другого. Собственно, вариация задачи о 8 Ферзях, решений которой довольно много, как и решений задачи о Ладьях. При этом, что одна, что вторая, не вызывают особых сложностей в описании возможных ходов. Но как быть с этим животным? Очевидно, что максимальное число коней равно N*N/2. И все фигуры будут стоять либо на черных клетках, либо на белых. В силу своей бездарности в прологе у Братко была взята программа, решающая задачу о Ферзях:
Листинг программы
  1. solution([]).
  2. solution([X/Y | Others]) :- solution(Others), member(Y,[1,2,3,4,5,6,7,8]),
  3. noattack(X/Y, Others).
  4. noattack(_, []).
  5. noattack(X/Y, [X1/Y1 | Others]) :-
  6. Y =\= Y1,
  7. Y1-Y =\= X1-X,
  8. Y1-Y =\= X-X1,
  9. noattack(X/Y, Others).
  10. member(Item, [Item | Rest]).
  11. member(Item, [First | Rest]) :- member(Item, Rest).
  12. template([1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y9]).
И предпринята попытка переделать её под коней, а именно, изменить функцию noattack() (для N=4 и 8 коней, ибо для N=8 все 32 коня не умещаются на экране вывода, просто скрываются под многоточием после восьмого элемента, как выводить больше, кстати?):
Листинг программы
  1. solution([]).
  2. solution([X/Y | Others]) :- solution(Others), member(Y,[1,2,3,4]),
  3. noattack(X/Y, Others).
  4. noattack(_, []).
  5. noattack(X/Y, [X1/Y1 | Others]) :-
  6. ((X=\=X1+1 , Y=\=Y1+2),
  7. (X=\=X1+2 , Y=\=Y1+1),
  8. (X=\=X1+2 , Y=\=Y1-1),
  9. (X=\=X1+1 , Y=\=Y1-2),
  10. (X=\=X1-1 , Y=\=Y1-2),
  11. (X=\=X1-2 , Y=\=Y1-1),
  12. (X=\=X1-2 , Y=\=Y1+1),
  13. (X=\=X1-1 , Y=\=Y1+2)),
  14. noattack(X/Y, Others).
  15. member(Item, [Item | Rest]).
  16. member(Item, [First | Rest]) :- member(Item, Rest).
  17. template([1/Y1, 2/Y2, 3/Y3, 4/Y4, 1/Y5, 2/Y6, 3/Y7, 4/Y8]).
Но пролог со мной не согласился. Что не так?

Решение задачи: «SWI-Prolog, Шахматная задача, Конь»

textual
Листинг программы
  1. between(1, 8, X), between(1, 8, Y), between(1, 8, X1), between(1, 8, Y1), not([X,Y]=[X1,Y1]), move_chess_figure(Figure, [X, Y], [X1, Y1]).

Объяснение кода листинга программы

  1. Между 1 и 8 находится переменная X.
  2. Между 1 и 8 находится переменная Y.
  3. Между 1 и 8 находится переменная X1.
  4. Между 1 и 8 находится переменная Y1.
  5. Переменные X и Y не равны X1 и Y1.
  6. Выполняется ход фигуры на шахматной доске, где Figure - это название фигуры, [X, Y] - начальное положение фигуры, [X1, Y1] - конечное положение фигуры.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут