我试图解决自定义矩阵的国际象棋骑士问题,但我不知道问题在哪里。 国际象棋骑士必须访问每个地方一次,当他设法访问所有领域然后完成该计划。目前,他一直在寻找正确的领域组合,这需要很长时间...... 我不知道接下来该做什么或改变什么
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).
示例:move(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,他无法找到组合......
答案 0 :(得分:0)
新尝试。这段代码:
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
这不是你所期待的吗?