-2

我想在 Prolog 中可视化 n-queens 问题。

像这样,

1? -queen(1,2,5).
===================
# Q # # #
# # # Q #
Q # # # #
# # Q # #
# # # # Q
===================
===================
# Q # # #
# # # # Q
# # Q # #
Q # # # #
# # # Q #
===================

Total Output is 2
true.

所以,我想在 Prolog 中使用这个 N-queens。

solution(_, []).
solution(N, [X/Y|Others]) :-
    solution(N, Others),
    between(1, N, Y),
    noattack(X/Y, Others).

noattack(_,[]).
noattack(X/Y, [X1/Y1 | Others]) :-
    Y =\= Y1,
    Y1-Y =\= X1-X,
    Y1-Y =\= X-X1,
    noattack( X/Y, Others).

template(N, L) :-
    findall(I/_, between(1,N,I), L).

这就像这样的输出。

?- N=6, template(N, L), solution(N, L).
N = 6,
L = [1/5, 2/3, 3/1, 4/6, 5/4, 6/2] ;
N = 6,
L = [1/4, 2/1, 3/5, 4/2, 5/6, 6/3] ;
N = 6,
L = [1/3, 2/6, 3/2, 4/5, 5/1, 6/4] ;
N = 6,
L = [1/2, 2/4, 3/6, 4/1, 5/3, 6/5] ;

女王(X,Y,N)

(X, Y) 是皇后的位置。

(N) 是女王学位。

我想通过以下方式可视化这个 N-queens 问题

找到 L 的组件和可视化组件。

例如,如果你发现 L = [...,3/4,...]

打印出这个#是N-1次,Q是第四次。

这是 Prolog 中容易出错的代码。

queen(X,Y,N):-
    position(X,Y), %consummate this L list and bring to Ls
    print_queen( Ls , N).

我不知道如何表示这个

position(X,Y).    

print_queen(Ls, N).

queen(X,Y,N).    

部分。

4

1 回答 1

0

我将尝试为您请求的格式化输出提供SWI-Prolog解决方案。

要使用 '#' 和 'Q'打印一条N带有女王位置的大小线,您可以使用:Col

Col1 is Col - 1, format('~|~`#t~*+Q~`#t~*|~n',[Col1, N]).

有关. _ _ format/2例如:

?- Col = 3, N = 8, Col1 is Col-1, format('~|~`#t~*+Q~`#t~*|~n',[Col1,N]).
##Q#####

现在,假设您的解决方案是这种形式[1/Q1, 2/Q2, 3/Q3, ..., N/QN],您可以使用forall/2来满足format/2每个皇后(列表中的元素):

print_queens(Queens, N):-
    forall(member(_/Col, Queens),
           ( Col1 is Col-1, format('~|~`#t~*+Q~`#t~*|~n',[Col1,N]) )
          ).

使用上述谓词:

?- print_queens([1/3,2/1,3/4,4/5,5/3,6/6], 6).
##Q###
Q#####
###Q##
####Q#
##Q###
#####Q
true.

稍后编辑(在评论澄清后):为了打印N-queens 的所有解决方案,给其中一个固定位置:

queen(X, Y, N):-
    template(N, L),    % Build the template of the solution
    member(X/Y, L),    % Unify given value for Y with its corresponding variable in L
    !,                 % Green cut

    % Count solutions while printing them
    findall(s, (solution(N, L), print_queens(L, N)), All),

    % Print total number of solutions
    length(All, Len),
    format('Total Output is ~w.~n', [Len]).
于 2014-06-17T08:59:24.327 回答