问题是在3x3棋盘中用两个白色骑士交换2个黑骑士位置,请参阅链接http://www.puzzles.com/puzzleplayground/FourKnights/FourKnights.htm 我必须让Prolog给我至少一个解决方案,我完全失去了这些步骤。
%mouvement possibilities
mouv(2,1).
mouv(-2,1).
mouv(2,-1).
mouv(-2,-1).
mouv(1,2).
mouv(-1,2).
mouv(1,-2).
mouv(-1,-2).
%conditions for valid mouvement
%not going out of the small chessboard
pos(X,Y):- X<4 ,X>0,Y<4,Y>0.
%free position
%????????
%initial positions
kgt(b,3,1).
kgt(b,3,3).
kgt(w,1,3).
kgt(w,1,1).
%mouv knight
%???
接下来我该怎么做?
答案 0 :(得分:3)
一种简单(且效率低下)的方式可以应用于一个有效的移动,并迭代直到所需的位置出现。当然,我们应该避免重复已经访问过的位置,因为这会导致无限循环。
然后我们需要一种方法来表示这个搜索空间。董事会名单是显而易见的选择。
董事会可以是一个分类的分段列表,当我们看到我们是否达到目标位置时,它们很方便,并且移动后的董事会尚未被访问过。
puzzle :-
setof(kgt(C,X,Y), kgt(C,X,Y), InitialBoard),
apply_moves([InitialBoard], Boards),
maplist(writeln, Boards).
apply_moves([Board|Visited], Solution) :-
move_knight(Board, Moved),
not_visited(Moved, Visited),
Next = [Moved,Board|Visited],
( is_target(Moved)
-> Solution = Next
; apply_moves(Next, Solution)
).
move_knight(Board, Moved) :-
select(kgt(C,X,Y), Board, B1),
...
is_target(Board) :-
...
not_visited(Moved, Visited) :-
\+ memberchk(Moved, Visited).
看看你是否可以填写省略号。