Prolog国际象棋骑士算法
Prolog chess knight algorithm
我正在尝试解决自定义矩阵的国际象棋骑士问题,但我不知道问题出在哪里。
一个象棋骑士必须每个地方都走一遍,当他设法走遍所有领域时,程序就结束了。目前,他一直在寻找正确的字段组合,需要很长时间……
我不知道下一步该做什么或要更改什么
append([], POINT, [POINT]).
append([H|T], POINT, [H|R]) :-
append(T, POINT, R).
member(POINT,[POINT|_]).
member(POINT,[_|R]) :-
member(POINT, R).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 1 < Xmax, Y + 2 < Ymax, A is X + 1, B is Y + 2).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 2 < Xmax, Y + 1 < Ymax, A is X + 2, B is Y + 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 2 < Xmax, Y - 1 >= Ymax - Ymax, A is X + 2, B is Y - 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 1 < Xmax, Y - 2 >= Ymax - Ymax, A is X + 1, B is Y - 2).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 1 >= Xmax - Xmax, Y - 2 >= Ymax - Ymax, A is X - 1, B is Y - 2).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 2 >= Xmax - Xmax, Y - 1 >= Ymax- Ymax, A is X - 2, B is Y - 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 2 >= Xmax - Xmax, Y + 1 < Ymax, A is X - 2, B is Y + 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 1 >= Xmax - Xmax, Y + 2 < Ymax, A is X - 1, B is Y + 2).
move(X, Y, Xmax, Ymax, L) :-
not(member([X, Y], L)),
write('X='), write(X),
write('Y='), write(Y), nl,
try(X, Y, Xmax, Ymax, A, B),
append(L, [X, Y], L2),
move(A, B, Xmax, Ymax, L2).
示例:移动(0, 0, 3, 3, []).
输出
X=0Y=0
X=1Y=2
X=2Y=0
X=0Y=1
X=2Y=2
X=1Y=0
X=0Y=2
X=2Y=1
X=2Y=1
X=0Y=2
X=1Y=0
X=2Y=2
X=0Y=1
X=2Y=0
X=1Y=2
false
没错,因为它永远不会在矩阵的中心。
但是对于矩阵 5x5 他找不到组合...
新的尝试。此代码:
move(X,Y,Xmax,Ymax,L) :-
( try(X,Y,Xmax,Ymax,A,B), not(member([A,B],L)) ->
write('X='), write(A), write(' '), write('Y='), write(B), nl,
append(L,[A,B],L2),
move(A,B,Xmax,Ymax,L2)
; true ).
给我(move(0,4,5,5,[])
):
X=2 Y=3
X=4 Y=4
X=3 Y=2
X=4 Y=0
X=2 Y=1
X=3 Y=3
X=4 Y=1
X=2 Y=0
X=0 Y=1
X=1 Y=3
X=3 Y=4
X=4 Y=2
X=3 Y=0
X=1 Y=1
X=0 Y=3
X=2 Y=4
X=4 Y=3
X=3 Y=1
X=1 Y=0
X=2 Y=2
X=1 Y=4
X=0 Y=2
这不是您所期待的吗?
我正在尝试解决自定义矩阵的国际象棋骑士问题,但我不知道问题出在哪里。 一个象棋骑士必须每个地方都走一遍,当他设法走遍所有领域时,程序就结束了。目前,他一直在寻找正确的字段组合,需要很长时间…… 我不知道下一步该做什么或要更改什么
append([], POINT, [POINT]).
append([H|T], POINT, [H|R]) :-
append(T, POINT, R).
member(POINT,[POINT|_]).
member(POINT,[_|R]) :-
member(POINT, R).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 1 < Xmax, Y + 2 < Ymax, A is X + 1, B is Y + 2).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 2 < Xmax, Y + 1 < Ymax, A is X + 2, B is Y + 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 2 < Xmax, Y - 1 >= Ymax - Ymax, A is X + 2, B is Y - 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X + 1 < Xmax, Y - 2 >= Ymax - Ymax, A is X + 1, B is Y - 2).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 1 >= Xmax - Xmax, Y - 2 >= Ymax - Ymax, A is X - 1, B is Y - 2).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 2 >= Xmax - Xmax, Y - 1 >= Ymax- Ymax, A is X - 2, B is Y - 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 2 >= Xmax - Xmax, Y + 1 < Ymax, A is X - 2, B is Y + 1).
try(X, Y, Xmax, Ymax, A, B) :-
(X - 1 >= Xmax - Xmax, Y + 2 < Ymax, A is X - 1, B is Y + 2).
move(X, Y, Xmax, Ymax, L) :-
not(member([X, Y], L)),
write('X='), write(X),
write('Y='), write(Y), nl,
try(X, Y, Xmax, Ymax, A, B),
append(L, [X, Y], L2),
move(A, B, Xmax, Ymax, L2).
示例:移动(0, 0, 3, 3, []).
输出
X=0Y=0
X=1Y=2
X=2Y=0
X=0Y=1
X=2Y=2
X=1Y=0
X=0Y=2
X=2Y=1
X=2Y=1
X=0Y=2
X=1Y=0
X=2Y=2
X=0Y=1
X=2Y=0
X=1Y=2
false
没错,因为它永远不会在矩阵的中心。 但是对于矩阵 5x5 他找不到组合...
新的尝试。此代码:
move(X,Y,Xmax,Ymax,L) :-
( try(X,Y,Xmax,Ymax,A,B), not(member([A,B],L)) ->
write('X='), write(A), write(' '), write('Y='), write(B), nl,
append(L,[A,B],L2),
move(A,B,Xmax,Ymax,L2)
; true ).
给我(move(0,4,5,5,[])
):
X=2 Y=3
X=4 Y=4
X=3 Y=2
X=4 Y=0
X=2 Y=1
X=3 Y=3
X=4 Y=1
X=2 Y=0
X=0 Y=1
X=1 Y=3
X=3 Y=4
X=4 Y=2
X=3 Y=0
X=1 Y=1
X=0 Y=3
X=2 Y=4
X=4 Y=3
X=3 Y=1
X=1 Y=0
X=2 Y=2
X=1 Y=4
X=0 Y=2
这不是您所期待的吗?