Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Задача о восьми ферзях


Автор: MacTep 22.12.2006, 00:23
Как расставитьна шахматной доске 8 ферзей так, чтобы ни один из них не бил другого. Собственно сабж. Обыскал половину инета - попочка. Не нашел ничего толкового. Помогите, плиз.

Автор: Artemios 22.12.2006, 03:22
http://isr.by.ru/prolog/ch4_5.htm

Автор: MacTep 22.12.2006, 11:51
Artemios, ага. Видел я эту вырезку из Книги И.Братко "Программирование на языке ПРОЛОГ для искусственного интеллекта". И даже книга в ее живом проявлении лежит передо мной сейчас. Да вот только сделать так, чтобы эта программа заработала кто-нибудь может? smile ... Вотиманна...

Автор: Artemios 22.12.2006, 14:50
Цитата(MacTep @  22.12.2006,  11:51 Найти цитируемый пост)
Да вот только сделать так, чтобы эта программа заработала кто-нибудь может?

SWI-Prolog. Программу №1 из Братко немного модифицировал:
Код

%Ферзь не бьет остальных
небьет(_,[]). %Некого бить
небьет([X,Y],[[X1,Y1]|Остальные]):-
    Y\=Y1, %Разные Y-координаты
    Y1-Y\=X1-X, %Разные диагонали
    Y1-Y\=X-X1,
    небьет([X,Y],Остальные).

принадлежит(X,[X|_]).
принадлежит(X,[_|L]):-
    принадлежит(X,L).

решение([]).
решение([[X,Y]|Остальные]):-
    %Первый ферзь на поле [X,Y],
    %остальные ферзи на полях из списка Остальные
    решение(Остальные),
    принадлежит(Y,[1,2,3,4,5,6,7,8]),
    небьет([X,Y],Остальные).

%Шаблон решения

шаблон([[1,_],[2,_],[3,_],[4,_],[5,_],[6,_],[7,_],[8,_]]).

проверка:
Цитата

?- шаблон(S),решение(S).

S = [[1, 7], [2, 8], [3, 5], [4, 6], [5, 4], [6, 3], [7, 2], [8, 1]] ;

S = [[1, 5], [2, 8], [3, 7], [4, 6], [5, 4], [6, 3], [7, 2], [8, 1]] ;

S = [[1, 7], [2, 5], [3, 8], [4, 6], [5, 4], [6, 3], [7, 2], [8, 1]] ;

S = [[1, 6], [2, 8], [3, 5], [4, 7], [5, 4], [6, 3], [7, 2], [8, 1]] ;

S = [[1, 6], [2, 5], [3, 8], [4, 7], [5, 4], [6, 3], [7, 2], [8, 1]]

и так далее -- все вырианты выводит (прим. мое - Artemios)

Автор: MacTep 22.12.2006, 23:40
Цитата(Artemios @  22.12.2006,  14:50 Найти цитируемый пост)
SWI-Prolog. 

А где его можно взять? smile

Автор: Artemios 22.12.2006, 23:58
http://www.swi-prolog.org/
А в принципе, необязательно именно SWI использовать, посмотри http://forum.vingrad.ru/s/8096476ff87683221be90423c23736f2/topic-120464.html много ссылок на разные Прологи. 

Автор: Artemios 24.12.2006, 00:12
Извиняюсь, в программе вместо \= нужно везде =\= поставить.
Тогда правильные ответы выдает:
Цитата

?- шаблон(Ы),решение(Ы).

Ы = [[1, 4], [2, 2], [3, 7], [4, 3], [5, 6], [6, 8], [7, 5], [8, 1]] ;

Ы = [[1, 5], [2, 2], [3, 4], [4, 7], [5, 3], [6, 8], [7, 6], [8, 1]] ;

Ы = [[1, 3], [2, 5], [3, 2], [4, 8], [5, 6], [6, 4], [7, 7], [8, 1]] ;

Ы = [[1, 3], [2, 6], [3, 4], [4, 2], [5, 8], [6, 5], [7, 7], [8, 1]] ;

Ы = [[1, 5], [2, 7], [3, 1], [4, 3], [5, 8], [6, 6], [7, 4], [8, 2]] 

... и т.д.

(забыл, что для числовых выражений свои операторы сравнения)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)