0

我想找到所有可能的 3x3 幻方。

引用英文维基百科

幻方是不同数字的排列(即每个数字只使用一次),通常是整数,在方格中,其中每行和每列中的数字以及主对角线和辅助对角线中的数字都相加最多相同的数字。

这是一个示例解决方案:

8 1 6
3 5 7
4 9 2

我如何编写一个 Prolog 程序来找到所有解决方案而不使用library(clpfd)?

4

1 回答 1

3

这是一个使用 SWI-Prolog 但不是 clpfd 的解决方案:

square(L) :-
    setof(S, carre(S), L).

carre(L) :-
    L = [[A, B, C],
         [D, E, F],
         [G, H, I]],
    flatten(L, LF),
    numlist(1,9, LN),
    init(LF, LN),
    15 is A + B + C,
    15 is D + E + F,
    15 is G + H + I,
    15 is A + D + G,
    15 is B + E + H,
    15 is C + F + I.

init([H|T], L) :-
    select(H, L, L1),
    init(T, L1).
init([], []).
于 2012-04-20T12:57:56.083 回答