我最近拿起了序言,并正在尝试制作一个程序来为著名的拼图骑士之旅找到解决方案 [在此处找到]
使用Warnsdorff算法,我试图找到可以从棋盘上的特定位置进行的所有可能的移动,然后进行移动后可能移动最少的移动,然后重复该过程,但是我有找不到所说的动作。
到目前为止,这是我的代码
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).
由于仅在找到所有可能移动的数量后才计算它们,因此我的列表未按我需要的方式排序。
例如这个输入
warnsdorff(8,8,3,5,[[1,1],[2,3],[3,5]], NewX, NewY, Score).
结果应该是
NewX = 4,
NewY = 7,
Score = 5
但是我得到
NewX = 1,
NewY = 4,
Score = 3
如果有人可以帮助我获得最低分数NewX
,NewY
那就太好了