2017-05-01 1 views
0

나이트 투어 문제를 해결하려고합니다. 최소한의 움직임이있는 자세를 취해야합니다. 나는 위치 (search_path)에있는 움직임의 수를 계산하는 나의 규칙을 가지고 있지만, 나는 그 규칙의 최소값 (search_path_min)을 얻어야한다.프롤로그에서 최소값 가져 오기

moves(X, Y, Xi, Yi, Size) :- 
    (Xi is X - 1, Yi is Y - 2 
    ; Xi is X - 1, Yi is Y + 2 
    ; Xi is X + 1, Yi is Y - 2 
    ; Xi is X + 1, Yi is Y + 2 
    ; Xi is X - 2, Yi is Y - 1 
    ; Xi is X - 2, Yi is Y + 1 
    ; Xi is X + 2, Yi is Y - 1 
    ; Xi is X + 2, Yi is Y + 1), 
    Xi > 0, 
    Yi > 0, 
    Xi =< Size*Size, 
    Yi =< Size*Size. 

posibles_moves(Size, X, Y, Tour, Xi, Yi):- 
    moves(X, Y, Xi, Yi, Size), 
    \+ member((Xi,Yi),Tour). 

posibles_moves_count(Size, X, Y, Tour, Count):- 
    findall(_, posibles_moves(Size, X, Y, Tour, Xi, Yi), Moves), 
    length(Moves, Count). 

search_path(Size, X, Y, Tour, Xi, Yi, Count):- 
    posibles_moves(Size, X, Y, Tour, Xi, Yi), 
    posibles_moves_count(Size, Xi, Yi, [(Xi,Yi)|Tour],Count). 

search_path_min(Size, X, Y, Tour, Xi, Yi):- 
    search_path(Size, X, Y, Tour, Xi, Yi, Count), 
    ? 
    ? 
    ? 
    ? 

knight_tour(Size, X, Y, Tour, Path) :- 
    length(Tour, L), 
    L =:= Size * Size - 1, 
    _Tour = [(X, Y) | Tour], 
    reverse(_Tour, Path). 

knight_tour(Size, X, Y, Tour, Path) :- 
    length(Visits, L), 
    L < Size * Size - 1, 
    search_path_min(Size, X, Y, Tour, Xi, Yi), 
    _Tour = [(X, Y) | Tour], 
    knight_tour(Size, Xi, Yi, _Tour, Path). 

내 규칙 search_path Count 변수의 최소값을 갖는 결과를 가져와야합니다. 감사합니다. .

답변

0

나는 그것을

search_path_min(Size, X, Y, Tour, Minimum):- 
    findall(min(Xi,Yi,Count),search_path(Size,X,Y,Tour,Xi,Yi,Count),[H|Rest]), 
    search_path_min(H,Rest,Minimum). 

search_path_min(Minimum, [], Minimum). 

search_path_min(min(X,Y,C),[min(X2,Y2,C2)|Rest],Minimum):- 
    C < C2 -> search_path_min(min(X,Y,C),Rest,Minimum); 
       search_path_min(min(X2,Y2,C2),Rest,Minimum). 
를 해결할 수
관련 문제