8 Queen 문제의 일반화.
어떻냐? 토나오냐? ㅋ
eight_queens([], [], _, _, _).
eight_queens([Y | Ys], [X | Xs], NextYs, UpperDigs, LowerDigs) :-
select(Y, NextYs, GoodYs),
UpperDig is X - Y,
select(UpperDig, UpperDigs, GoodUpperDigs),
LowerDig is X + Y,
select(LowerDig, LowerDigs, GoodLowerDigs),
eight_queens(Ys, Xs, GoodYs, GoodUpperDigs, GoodLowerDigs).
eight_queens(YQueens) :-
numlist(1, 8, XYs),
MinXYDiff is 1 - 8, % X - Y
MaxXYDiff is 8 - 1,
MinXYSum is 1 + 1, % X + Y
MaxXYSum is 8 + 8,
numlist(MinXYDiff, MaxXYDiff, UpperDigs),
numlist(MinXYSum, MaxXYSum, LowerDigs),
eight_queens(YQueens, XYs, XYs, UpperDigs, LowerDigs).
% statistics(runtime, _), eight_queens(X), statistics(runtime, CPU).
%
% 일반화 - eight_queens를 n_queens로 이름만 바꾸고, 하드코드된 숫자를 변수로
%
n_queens([], [], _, _, _).
n_queens([Y | Ys], [X | Xs], NextYs, UpperDigs, LowerDigs) :-
select(Y, NextYs, GoodYs),
UpperDig is X - Y,
select(UpperDig, UpperDigs, GoodUpperDigs),
LowerDig is X + Y,
select(LowerDig, LowerDigs, GoodLowerDigs),
n_queens(Ys, Xs, GoodYs, GoodUpperDigs, GoodLowerDigs).
n_queens(N, YQueens) :-
numlist(1, N, XYs),
MinXYDiff is 1 - N, % X - Y
MaxXYDiff is N - 1,
MinXYSum is 1 + 1, % X + Y
MaxXYSum is N + N,
numlist(MinXYDiff, MaxXYDiff, UpperDigs),
numlist(MinXYSum, MaxXYSum, LowerDigs),
n_queens(YQueens, XYs, XYs, UpperDigs, LowerDigs).
% statistics(runtime, _), n_queens(12, X), statistics(runtime, CPU).
댓글 0