0

我想找到迷宫下面的路径

1 2 3 4 5 6 7 8 9
  +-----------------+
1 |. . . . . . . x .|
2 |x x . x x . . . .|
3 |. . . x . . x . x|
4 |. . . x . . x x x|
5 |. x . . . . . . .|
  +-----------------+

下面的查询失败,我的代码哪里错了?

?- solve_maze(5, 9, [1/8, 2/1, 2/2,
   2/4, 2/5, 3/4, 3/7, 3/9, 4/4, 4/7, 4/8, 4/9, 5/2], 3/2, 2/6, Path).
false.

maze_size(5, 9).
    
barrier(Nodes):-
   member(X,Nodes), generate(X,X0,Y0), barrier(X0,Y0).
    
barrier(_,_).
goal(2/6).

move_cyclefree(Visited, Node,NextNode) :-
   %available_move(Node, NextNode),
   %split_string(Node, "/","",[K,B]),
   %atom_number(K, X0),atom_number(B, Y0),
   generate(Node,X0,Y0),
   available_tile([X0,Y0]),
   available_move(Node, NextNode),
   \+ member(NextNode, Visited).

path(Node, Node, [Node]).
path(Node, LastNode,Path) :-
   path(Node, SecondToLastNode, SecondToLastPath),
   move_cyclefree(SecondToLastPath, SecondToLastNode, LastNode),
   append(SecondToLastPath, [LastNode], Path).

solve_iterative_deepening(Node,To,Path) :-
   path(Node, To, Path),
   goal(To).

%% True if moving from [X0, Y0] to [X1, Y1] is valid
available_move(Node, NextNode) :-
   generate(Node,X0,Y0), generate(NextNode,X1,Y1),
   %split_string(Node, "/","",[K,B]), 

split_string(NextNode, "/","",[K2,B2]),
   %atom_number(K, X0),atom_number(B, Y0),atom_number(K2, X1),atom_number(B2, Y1),
   adj_tile([X0,Y0], [X1,Y1]), %geitwniko tetragwnaki
   %% available_tile(X0,Y0),
   available_tile(X1,Y1).

%% True if tile is inside the maze
inside_maze(X1,Y1) :-
   maze_size(A,B),
   X1>=1,
   X1=<A,
   Y1>=1,
   Y1=<B.

%% True tile can be used in a path
available_tile([X,Y]) :-
   available_tile(X,Y).
available_tile(X,Y) :-
   %split_string(Node, "/","",[K,B]),
   %atom_number(K, X0),atom_number(B, Y0),
   inside_maze(X,Y),
   \+ barrier(X,Y).

%% True if [X0, Y0] is adjacent to [X1, Y1]
adj_tile([X0,Y0], [X0,Y1]) :-
   (Y1 is Y0-1).
adj_tile([X0,Y0], [X1,Y0]) :-
   (X1 is X0-1).
adj_tile([X0,Y0], [X0,Y1]) :-
   (Y1 is Y0+1).
adj_tile([X0,Y0], [X1,Y0]) :-
   (X1 is X0+1).

generate([X1/Y1],X,Y) :-
   member(X1, [1,2,3,4,5]), member(Y1, [1,2,3,4,5,6,7,8,9]),
   X is X1, Y is Y1.    

solve_maze(M,N,Barriers,From,To,Path):-
   maze_size(M,N),
   barrier(Barriers),
   solve_iterative_deepening(From,To,Path).
4

0 回答 0