J'ai récemment repris Prolog et essaie de faire un programme pour trouver une solution pour le célèbre casse-tête Tour Chevalier [trouvé ici]listes Trier du plus court au plus long
En utilisant l'algorithme Warnsdorff je suis en train pour trouver tous les mouvements possibles à partir d'un endroit spécifique sur l'échiquier et ensuite faire le mouvement qui a le moins de mouvements possible une fois qu'il est fait, puis répétez le processus, mais j'ai du mal à trouver ledit mouvement.
Voici mon code jusqu'à présent
possibleKnightMove(I, J, I1, J1) :- I1 is I+1, J1 is J+2.
possibleKnightMove(I, J, I1, J1) :- I1 is I+2, J1 is J+1.
possibleKnightMove(I, J, I1, J1) :- I1 is I+2, J1 is J-1.
possibleKnightMove(I, J, I1, J1) :- I1 is I+1, J1 is J-2.
possibleKnightMove(I, J, I1, J1) :- I1 is I-1, J1 is J-2.
possibleKnightMove(I, J, I1, J1) :- I1 is I-2, J1 is J+1.
possibleKnightMove(I, J, I1, J1) :- I1 is I-2, J1 is J-1.
possibleKnightMove(I, J, I1, J1) :- I1 is I-1, J1 is J+2.
possible_knight_moves(Rows, Columns, X, Y, Visited, NewX, NewY) :-
possibleKnightMove(X, Y, NewX, NewY),
NewX > 0, NewX =< Rows,
NewY > 0, NewY =< Columns,
\+ member([NewX,NewY], Visited).
possible_moves_count(Rows, Columns, X, Y, Visited, Count) :-
findall(_, possible_knight_moves(Rows, Columns, X, Y, Visited, _NewX, _NewY), Moves),
length(Moves, Count).
warnsdorff(Rows, Columns, X, Y, Visited, NewX, NewY, Score) :-
possible_knight_moves(Rows, Columns, X, Y, Visited, NewX, NewY),
possible_moves_count(Rows, Columns, NewX, NewY, [[NewX, NewY] | Visited], Score).
Étant donné que le nombre de mouvements possibles n'est compté après les trouver tout alors ma liste ne sont pas triées comment je besoin d'être.
par exemple avec cette entrée
warnsdorff(8,8,3,5,[[1,1],[2,3],[3,5]], NewX, NewY, Score).
le résultat devrait être
NewX = 4,
NewY = 7,
Score = 5
mais je reçois
NewX = 1,
NewY = 4,
Score = 3
Si quelqu'un pouvait me aider à NewX
et NewY
avec le score minimum ce serait génial
Quelle requête entrez-vous? – lurker
désolé j'ai oublié de le mentionner, je vais éditer ma question – vega2015
Quelle partie de votre code devrait, selon vous, faire appliquer que le «Score» soit minimum? En outre, je ne suis pas sûr que le code que vous affichez est le code que vous avez exécuté. Ce que vous affichez génère une erreur d'instanciation avec cette requête. – lurker