Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2017, 15:53   #1
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 44
Вопрос Помощь по задаче на Prolog

Здраствуйте, в универе задали задачу: написать программу, которая разместит 10 коней на доске 8х8 так, чтобы ни один из них не бил другого. Пример из методички о 5 ферзях на доске 5х5:

domains
queen = q(integer, integer)
queens = queen*
freelist = integer*
board = board(queens, freelist, freelist, freelist, freelist)

predicates
placeN(integer, board, board)
place_a_queen(integer, board, board)
nqueens(integer)
makelist(integer, freelist)
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),
write(Final).

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]) :- N1 = N-1, makelist(N1, Rest).

nextrow(Row, [Row|Rest], Rest).

Заранее спасибо!
alexboliam вне форума Ответить с цитированием
Старый 11.10.2017, 07:55   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Так, а что не получается?
Хранишь список коней. Последовательно перебираешь клетки, проверяешь что клетка свободна и не бьется (проверяешь список коней). Ставишь коня. Продолжаешь пока не поставишь нужное число коней...
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в задаче Semyon++ Общие вопросы C/C++ 0 05.12.2016 19:15
С и С++. Помощь в простейшей задаче VikkyVi Помощь студентам 1 02.04.2016 17:10
Нужна помощь в решении задачи по PROLOG Sergmaestro Помощь студентам 1 08.10.2014 05:50
нужна помощь в задаче с массивами frefres Помощь студентам 1 16.12.2009 21:59