Declaratieve Talen/Oplossing K Queens: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Merel (overleg | bijdragen)
Geen bewerkingssamenvatting
 
Beau (overleg | bijdragen)
redirect naar n-queens
 
(Een tussenliggende versie door een andere gebruiker niet weergegeven)
Regel 1: Regel 1:
=DT: oplossing voor het probleem K-Queens=
#REDIRECT [[Declaratieve_Talen/Oplossing_N-queens]]
 
(zie niet direct nog optimalisaties, nog iemand ideeën? Merel)
 
% beginmethode: Opl zal van de vorm [1,2,3,4,5,6,..] zijn
nqueens(N, Opl) :-
    nqueens(N, 1, [], Opl).
 
% C is current kolum, Accum van vorm [(1,x), (2,y), ..]
nqueens(N, C, Accum, Opl) :-
    (
      check_row_constraint(Accum) ->
        fail
    ;
      check_diagonal_constraint(N, Accum) ->
        fail
    ;
      C > N ->
        findall(B, member((_,B), Accum), Opl)
    ;
      get_next_choice(N, C, Choice),
      C1 is C + 1,
      nqueens(N, C1, [Choice|Accum], Opl)   
    ).
 
% constraintchecking   
check_row_constraint(Accum) :-
    member((A, B), Accum),
    member((C, D), Accum),
    A \== C,
    B == D, !.
 
% diagonaal rechts naar boven check
check_diagonal_constraint(N, Accum) :-
    member((A, B), Accum),
    between(1, N, D),
    D \== 0,
    F is A + D,
    G is B + D,
    member((F, G), Accum).
 
% diagonaal links naar boven check
check_diagonal_constraint(N, Accum) :-
    member((A, B), Accum),
    between(1, N, D),
    D \== 0,
    F is A - D,
    G is B + D,
    member((F, G), Accum).
 
% volgende keuze           
get_next_choice(N, C, Choice) :-
    between(1, N, A),
    Choice = (C, A).

Huidige versie van 18 jun 2006 10:21