Prolog国际象棋骑士算法

时间:2017-11-30 19:23:52

标签: algorithm prolog knights-tour

我试图解决自定义矩阵的国际象棋骑士问题,但我不知道问题在哪里。 国际象棋骑士必须访问每个地方一次,当他设法访问所有领域然后完成该计划。目前,他一直在寻找正确的领域组合,这需要很长时间...... 我不知道接下来该做什么或改变什么

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,他无法找到组合......

1 个答案:

答案 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

这不是你所期待的吗?