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).