You are on page 1of 3

Problem osam kraljica

Problem osam kraljica predstavlja problem postavljanja osam kraljica na ahovsko polje (8x8,
64), tako da niti jedna kraljica napada drugu kraljicu. Rjeenje zahtijeva da dvije kraljice se ne
nalaza u istom redu , stupcu ili dijagonali. Problem osam kraljica je primjer openitijeg problema
N-kraljica na NxN ahovskom polju, gdje postoji rjeenje za sve prirodne brojeve osim za N=2 i
N=3. Skup svih razmjetaja za NxN je (

) kombinacija, to za osam kraljica iznosi: (

)
(

) .
N: 1 2 3 4 5 6 7 8 9 ...
Temeljno: 1 0 0 1 2 1 6 12 46 ...
Sva: 1 0 0 2 10 4 40 92 352 ...

Gdje temeljno predstavlja broj temeljnih rjeenja tj. bez brojanja simetrinih rjeenja ili rjeenja
koja su slina samo zakrenuta za 90 ili 180, dok u polju sva se ukljuuju i ta rjeenja. Razliiti
pristupi rjeavanju provjeravaju razliite podskupove svih moguih rjeenja i zato su razliite
sloenosti:

Prvi pristup
Za svaki dozvoljeni poloaj vrijedi pravilo da u svakom stupcu se nalazi tono jedna
kraljica, rjeenje je prikazano listom koordinate retka, dok je koordinata stupca jednaka
rednom broju kraljice unutar liste, npr. [2,0,3,1] (Slika x). Ima n! rjeenja to je podskup
od skupa permutacija liste elemenata od 0 no n-1.





Predikaton rjesenje1 provjeravamo redom prostor svih razmjetanja, koji je smanjen na
n!. Predikat ne_napada(Kraljica, Lista, Udaljenost) je toan ako kraljica, ije su
koordinate (Kraljica, Stupac), ne napada neku od kraljica kojoj su koordinate retka unutar
liste, a koordinate stupca Stupac+Udaljenost, Stupac+Udaljenost+1, ... s tim smo
osigurali da se kraljice ne napadaju po retcima i stupcima i zatim osiguramo da se ne
napadaju po silaznoj odnosno uzlaznoj dijagonali.

rjesenje(R) :-
permutacija([0, 1, 2, 3, 4, 5, 6, 7], R),
rjesenje1(R).

rjesenje1([]).
rjesenje1([Prva|Ostale]) :-
rjesenje1(Ostale),
ne_napada(Prva, Ostale, 1).
ne_napada(_, [], _).
ne_napada(Kraljica, [Prva|Ostale], Udaljenost) :-
Kraljica-Prva =\= Udaljenost, % napadanje po silaznoj dijagonali
Prva-Kraljica =\= Udaljenost, % uzlazna dijagonala
Udaljenost1 is Udaljenost +1,
ne_napada(Kraljica, Ostale, Udaljenost+1).
Drugi pristup
Poloaj n kraljica je definiran listom parova koordinata. Rjeava se na nain da se prva
kraljica izdvoji iz liste, provjerava se da preostale kraljice u repu ne napadaju jedna
drugu, zatim se provjeri da prva kraljica ne napda niti jednu kraljicu iz repa. Takoer se
primjenjuje injenica da dvije kraljice nemaju isti redak. Koordinate se odvajaju znakom
/.



Ovaj pristup je bolji za male n, jer se nova kraljica postavlja na polja ploe na kojima ne
napada ve postavljene kraljice. Naalost nije sigurno da djelomino rjeenje vodi do
cilja.

Trei pristup
Ovaj pristup predstavlja ubrzani nain drugog pristupa na nain da se ubrza zauzimanje
polja pomou tablice. Koriste se liste slobodnih redaka, stupaca i dijagonala. Za svaku
novu kraljicu koja se dodaje provjeravaju se njen redak, stupac i dijagonala da li se nalaze
u listama slobodnih, ako se ne nalazi nova kraljica se nalazi na poloaju meusobnog
napadanja sa nekom od prethodno postavljenih kraljica pa taj razmjestaj nije valjan.


sredi(R) :- R = [1/s1, 2/s2, 3/s3, 4/s4, 5/s5, 6/s6, 7/s7, 8/s8].

rjesenje([Red/Stupac|Ostale]) :-
rjesenje(Ostale),
element(Stupac, [1, 2, 3, 4, 5, 6, 7, 8]),
ne_napada(Red/Stupac, Ostale).

Ne_napada(R/S, [R1/S1|Ostale]) :-
S =\= S1, % stupac
S1-S =\= R1-R, % silazna dijagonala
S1-S =\= R-R1, % uzlazna dijagonala
ne_napada(R/S, Ostale).
?- sredi(R), rjesenje(R).

You might also like