1

問題は、3x3 チェス盤で 2 人の黒騎士の位置を 2 人の白騎士と交換することです。リンクhttp://www.puzzles.com/puzzleplayground/FourKnights/FourKnights.htmを参照してください。Prolog に少なくとも 1 つの解決策を提供させなければなりません。これらの手順の後、私は完全に迷っています。

%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

%???

次に何をすべきですか?

4

1 に答える 1

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

省略記号を入力できるかどうかを確認してください。

于 2013-01-21T15:05:05.277 に答える