Шахматная задача на Prolog

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Gelldar
Сообщения: 1
Зарегистрирован: 02 июн 2009, 18:30

Добрый день!
Подскажите пожалуйста, как мне переделать алгоритм программы о восьми ферзях...
Передо мной стоит похожая задача про ладей и слонов, по отдельности я научился их решать, а вот склеить никак не получается :(
Текст задачи:
Получить все расстановки фигур на шахматной доске размером n x n, для n/2 ладей и n/2 слонов.

Код программы, от которой я отталкивался (VisualProlog 5.2):

Код: Выделить всё

domains
 queen	= q(integer, integer)
 queens   = queen*
 freelist = integer*
 board	= board(queens, freelist, freelist, freelist, freelist)
database - counter
single counter(integer)
predicates
 nondeterm placeN(integer,board,board)
 nondeterm place_a_queen(integer,board,board)
 nondeterm nqueens(integer)
 nondeterm makelist(integer, freelist)
 nondeterm findandremove(integer, freelist, freelist)
 nextrow(integer, freelist, freelist)
 
clauses
 nqueens(N):- makelist(N,L),
	Diagonal=N*2-1,
	makelist(Diagonal,LL),
	placeN(N,board([],L,L,LL,LL),Final),Final=board(Queens,_,_,_,_),
	write(Queens),nl,counter(I),I1=I+1,assert(counter(I1)),
	fail;true.
 
 placeN(_,board(D,[],[],D1,D2),board(D,[],[],D1,D2)):-	!.
 placeN(N,Board1,Result):- place_a_queen(N,Board1,Board2),
	placeN(N,Board2,Result).
 
 place_a_queen(N,board(Queens,Rows,Columns,Diag1,Diag2),
 board([q(R,C)|Queens],NewR,NewC,NewD1,NewD2)):-
	nextrow(R,Rows,NewR),
	findandremove(C,Columns,NewC),D1=N+C-R,
	findandremove(D1,Diag1,NewD1),D2=R+C-1,
	findandremove(D2,Diag2,NewD2).
 
 findandremove(X,[X|Rest],Rest).
 findandremove(X,[Y|Rest],[Y|Tail]):- findandremove(X,Rest,Tail).
 
 makelist(1,[1]).
 makelist(N,[N|Rest]):- N>1,N1=N-1, makelist(N1,Rest).
 
 nextrow(Row,[Row|Rest],Rest).
 
 counter(0).
goal
 nqueens(8),counter(N).
Буду очень признателен, я не очень соображаю в прологе и крайне редко с ним сталкиваюсь, уже 3 дня ломаю голову, но ничего не получается :(
Ответить