我想在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皇后问题找到L&#39的组件和可视化组件。
例如,如果你发现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).
一部分。
答案 0 :(得分:0)
我会尝试为您请求的格式化输出提供 SWI-Prolog 解决方案。
要使用“#”和“Q”打印一个大小为N
且女王位于Col
的行,您可以使用:
Col1 is Col - 1, format('~|~`#t~*+Q~`#t~*|~n',[Col1, N]).
有关format/2
的详细信息,请参阅documentation。 E.g:
?- 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
- 皇后的所有解决方案,给出其中一个固定位置:
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]).