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


Автор: Tevad 30.4.2007, 11:57
Помогите решить задачу на турбо-прологе. Суть следующая: сколькими способами можно поставить на доске двух ферзей так, чтобы они не угрожали друг другу? . Везде искал, нашел токо о 8 ферзях. Пожалуста помогите.

Автор: Artemios 1.5.2007, 16:33
На SWI-Prolog:
Код

% клетки шахматной доски
клетки([8,8], L, [[8,8]|L]).
клетки([X,Y], L, L2):-
    Y<8,!, 
    Y1 is Y+1,
    клетки([X,Y1], [[X,Y]|L], L2).
клетки([X,Y], L, L2):-
    Y =:= 8,!,
    Y1 is 1,
    X1 is X+1,
    клетки([X1,Y1], [[X,Y]|L], L2).
клетки(L):-клетки([1,1],[],L).

небьет([X1,Y1],[X2,Y2]):-
    X1=\=X2,
    Y1=\=Y2,
    Y2-Y1=\=X2-X1,
    Y2-Y1=\=X1-X2.

% расстановки двух ферзей
расстановки([_],[],L,L).
расстановки([_|Kla],[],L,L2):-
    расстановки(Kla,Kla,L,L2).
расстановки([A|Kla],[B|Klb],L,L2):-
    небьет(A,B),!,
    расстановки([A|Kla],Klb,[[A,B]|L],L2).
расстановки([A|Kla],[_|Klb],L,L2):-
    расстановки([A|Kla],Klb,L,L2).

все_расстановки(L):-
    клетки(Kl),
    расстановки(Kl,Kl,[],L).



и считаем:
Цитата

?- все_расстановки(L),length(L,N).

L = [[[2, 1], [1, 3]], [[2, 1], [1, 4]], [[2, 1], [1, 5]], [[2, 1], [1, 6]], [[2, 1], [1, 7]], [[2, 1], [1|...]], [[2|...], [...|...]], [[...|...]|...], [...|...]|...]
N = 1288

Yes
?- 


1288 различных способов расстановки.

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