Author
nguyenminh
View
233
Download
2
Embed Size (px)
SVEUILITE U SPLITU
PRIRODOSLOVNO-MATEMATIKI FAKULTET
PROBLEM OSAM KRALJICA
Stefan Duni
Mentor:
prof.dr.sc. Slavomir Stankov
Neposredni voditelj:
dr.sc. Ani Grubii
Split, listopad 2013.
Problem osam kraljica
Sadraj
1 Uvod .................................................................................................................................... 1
2 Unatrano pretraivanje (eng. Backtracking) ..................................................................... 2
3 Problem N kraljica ............................................................................................................... 3
4 Primjena unatranog pretraivanja na problem etiri kraljice ........................................... 4
5 Implementacija unatranog pretraivanja na problem 8 kraljica ....................................... 8
5.1 Mogua rjeenja problema osam kraljica .................................................................... 8
5.2 Programska podrka .................................................................................................... 9
5.2.1 JavaScript .............................................................................................................. 9
5.2.2 KineticJS ................................................................................................................ 9
5.3 Upotreba JavaScript-e na problem osam kraljica ...................................................... 10
6 Rjeenja problema osam kraljica ...................................................................................... 12
7 Zakljuak ............................................................................................................................ 14
8 Literatura ........................................................................................................................... 15
9 Prilozi ................................................................................................................................. 16
9.1 Dodatak I dijelovi programskog koda ..................................................................... 16
Problem osam kraljica
1
1 Uvod
Problem osam kraljica, kao i njegovo poopenje, problem N kraljica veoma je poznat
problem i u matematici i u raunalnim znanostima. Problematikom su se jo u 19. stoljeu
poeli baviti poznati ahisti, a kasnije zbog zanimljivosti sluaja poeli su se baviti i
matematiari i informatiari, na to emo se samo kratko osvrnuti u treem poglavlju.
Temeljna ideja problema je kako smjestiti N kraljica na plou dimenzija NxN tako da se
one meusobno ne napadaju. Potrebno je nai sva mogua rjeenja koja bi zadovoljila
zadano pravilo. Za oekivati je da e se vrijeme rjeavanja problema poveavati s porastom
broja kraljica, to e se kasnije u radu i pokazati. Danas postoje razne metode rjeavanja
problema N kraljica ovisno o kompleksnosti samog problema, od rjeavanja na prste pa do
modernog pristupa koristei se heuristikim algoritmima.
Za svrhu ovog rada, odnosno za traenje rjeenja problema osam kraljica koristi se
rekurzivna metoda unatranog pretraivanja (eng. backtracking). Stoga u drugom poglavlju
odmah prije svega e se openito objasniti pojam unatranog pretraivanja, dok e se u
etvrtom poglavlju prikazati kroz primjer problema etiri kraljice.
U petom poglavlju izvriti e se implementacija unatranog pretraivanja pomou
JavaScript programskog jezika na problem osam kraljica.
Kroz esto poglavlje e se razjasniti razlika izmeu ukupnog broja rjeenja i jedinstvenog
broja rjeenja problema osam, a i openitijeg, kraljica.
U dodatku se nalazi kod napisan upotrebom JavaScript programskog jezika i osnovnih
HTML naredbi.
2 Unatrano pretra
Unatrano pretraivanje je openiti algoritam koji se temelji na sistematskom
pretraivanju moguih rjeenja nekog raunalnog problema.
pravih rjeenja, algoritam stvara mogue kandidate
potencijalne kandidate rjeenja
Samim time broj moguih rjeenja se smanjuje to omoguava bri pronalazak pravih
rjeenja.
Pozitivna strana upotrebe unatranog pret
algoritma doputa postavljanje poetnih uvjeta ime se u samom poetku
smanjuje broj moguih rjeenja.
Glavni zahtjev algoritma koji se treba ispuniti jest taj da mora postojati hijerarhija u
sistematskoj proceduri traenja rjeenja tako da se
odreeni uvjet odbaci prije nego li se stvori konano potencijalno rjeenje.
ispitivanje i stvaranje rjeenja prati model stablastog prikaza. Korijen stabla predstavlja skup
svih rjeenja. vorovi u niim
meusobno se razlikuju po svojstvima.
na nain da se vie ne stvaraju unaprijed odbaena rjeenja
stablu odbaci, cijelo njegovo podstablo je odbaeno
vora gdje testiramo mogunost postojanja mogueg
Budui da metoda kroz proces testiranja stvara podrazine rjeenja koje je teko obraditi,
metoda sama po sebi nije toliko popularna
Slika 1 Stablasti prikaz algoritma unatranog pretraivanja. Stablo se sastoji od korijena (vorova (krunice s brojevima 2 i 6) koji se i sami sastoje od svojih potomskih vorova (Iscrtkane krunice predstavljaju one vorove nakon kojih je algoritam unatranog pretraivanja ve unaprijed odbacio rjeenja jer ne zadovoljavaju odreene postavljene uvjete
Unatrano pretraivanje (eng. Backtracking)
trano pretraivanje je openiti algoritam koji se temelji na sistematskom
pretraivanju moguih rjeenja nekog raunalnog problema. Kroz postupak pronalaenja
stvara mogue kandidate dok istodobno uvjetovano odbacuje
rjeenja koji ne mogu vie na nikakav nain stvoriti valjano rjeenje.
Samim time broj moguih rjeenja se smanjuje to omoguava bri pronalazak pravih
Pozitivna strana upotrebe unatranog pretraivanja jest to da
algoritma doputa postavljanje poetnih uvjeta ime se u samom poetku
smanjuje broj moguih rjeenja.
Glavni zahtjev algoritma koji se treba ispuniti jest taj da mora postojati hijerarhija u
sistematskoj proceduri traenja rjeenja tako da se skup rjeenja koji ne zadovoljava
odreeni uvjet odbaci prije nego li se stvori konano potencijalno rjeenje.
ispitivanje i stvaranje rjeenja prati model stablastog prikaza. Korijen stabla predstavlja skup
svih rjeenja. vorovi u niim razinama predstavljaju manje skupove izoliranih rjeenja, a
po svojstvima. Stablo se stvara kroz testiranje potencijalnih rjeenja
ne stvaraju unaprijed odbaena rjeenja (Slika 1). Kad se jedan vor u
stablu odbaci, cijelo njegovo podstablo je odbaeno i mi se vraamo roditelju odbaenog
gunost postojanja mogueg rjeenja na iduem djet
Budui da metoda kroz proces testiranja stvara podrazine rjeenja koje je teko obraditi,
metoda sama po sebi nije toliko popularna (Wikipedia, Backtracking; Engelhardt, 2007.
Stablasti prikaz algoritma unatranog pretraivanja. Stablo se sastoji od korijena (krunica s 2 i 6) koji se i sami sastoje od svojih potomskih vorova (krunice s
nice predstavljaju one vorove nakon kojih je algoritam unatranog pretraivanja ve unaprijed odbacio rjeenja jer ne zadovoljavaju odreene postavljene uvjete.
Problem osam kraljica
2
Backtracking)
trano pretraivanje je openiti algoritam koji se temelji na sistematskom
Kroz postupak pronalaenja
dok istodobno uvjetovano odbacuje
stvoriti valjano rjeenje.
Samim time broj moguih rjeenja se smanjuje to omoguava bri pronalazak pravih
raivanja jest to da se prije izvoenja
algoritma doputa postavljanje poetnih uvjeta ime se u samom poetku uvjetovano
Glavni zahtjev algoritma koji se treba ispuniti jest taj da mora postojati hijerarhija u
skup rjeenja koji ne zadovoljava
odreeni uvjet odbaci prije nego li se stvori konano potencijalno rjeenje. Upravo zbog toga
ispitivanje i stvaranje rjeenja prati model stablastog prikaza. Korijen stabla predstavlja skup
razinama predstavljaju manje skupove izoliranih rjeenja, a
Stablo se stvara kroz testiranje potencijalnih rjeenja
Kad se jedan vor u
i mi se vraamo roditelju odbaenog
rjeenja na iduem djetetu.
Budui da metoda kroz proces testiranja stvara podrazine rjeenja koje je teko obraditi,
Engelhardt, 2007.).
krunica s brojem 1), te potomskih nice s brojevima 3,4,7), itd.
nice predstavljaju one vorove nakon kojih je algoritam unatranog pretraivanja ve unaprijed odbacio
3 Problem N kraljica
Problem kraljica je vrlo poznat matematiki problem, no prva mogla izvriti sve do poetka upotrebe
Prvi poznati pokuaj davanja
poznati ahist Max Bezzel pod pseudonimom Schachfreund predstavljeno je ukupno 40 rjeenjapostala popularna i drugoj vrsti publike, pa je tako 1850. godine Frarjeenja. U svom radu on je dodao da postoje ukupno 60 rjeenja glavnog problema.se ispravio sa izjavom da imaukljuio i Johann Carl Friedrich Gausspostoji mogunost da ih ima jo i vie.osam kraljica na problem N kraljica. rjeenja problema osam kraljica engleski matematiar J. W. L. Glaisher. Umatematiara, ali naalost ima jako malo zapisa o njihovoj meusobnoj raspravi1977.).
Novi zamah u istraivanju problema 1960-tih godina. Edsger Djikstra 1972. gmo onog to je on tada zvao strukturno programiranje. On je objavio veoma detaljan opis razvoja depth-first backtracking algorithm (dubinsko unatrano pretraivanje)1997.).
Danas se problem osam kraljica
raunalnim znanostima i esto se upotrebljava
problema je kao klasian kombinatorni problem u podruju umjetne inteligencije, a
pogotovo u sluaju prikazivanja algoritma unatranog pretraivanja.
Slika 2 Lijevo: Max Bezzel, poznati njemaki ahistznanstvenik iz 19. stoljea.
N kraljica
je vrlo poznat matematiki problem, no prva istraivanja se nisu i sve do poetka upotrebe jednostavnih algoritama.
davanja rjeenja za osam kraljica 1848. godinepoznati ahist Max Bezzel pod pseudonimom Schachfreund (Slika 2: lijevo).predstavljeno je ukupno 40 rjeenja od strane ahista. Nedugo nakon toga, ppostala popularna i drugoj vrsti publike, pa je tako 1850. godine Franz Nauck objavio i svoja
je dodao da postoje ukupno 60 rjeenja glavnog problema.se ispravio sa izjavom da ima ukupno 92 rjeenja problema osam kraljica
Johann Carl Friedrich Gauss (Slika 2 desno) s idejom da postoje 72 rjeenja, ali postoji mogunost da ih ima jo i vie. Gauss je bio prvi koji je pokuao generalizirati problem
kraljica na problem N kraljica. 1874. godine S. Gnther je predloio metodu pronalaska problema osam kraljica koristei se determinantama iji je pristup kasnije uljepao
J. W. L. Glaisher. U raspravu se kasnije ukljuilo matematiara, ali naalost ima jako malo zapisa o njihovoj meusobnoj raspravi
Novi zamah u istraivanju problema N kraljica uvelike su napravila dostupnost raunala tih godina. Edsger Djikstra 1972. godine je iskoristio problem osam kraljica
mo onog to je on tada zvao strukturno programiranje. On je objavio veoma detaljan opis first backtracking algorithm (dubinsko unatrano pretraivanje)
kraljica, kao i njegovo poopenje na problem N kraljica,
m znanostima i esto se upotrebljava kao praktina vjeba. Naje
klasian kombinatorni problem u podruju umjetne inteligencije, a
prikazivanja algoritma unatranog pretraivanja.
Lijevo: Max Bezzel, poznati njemaki ahist iz 19. stoljea. Desno: Johann Carl Friedrich Gauss, poznati njemaki
Problem osam kraljica
3
istraivanja se nisu
1848. godine je izdao tadanji lijevo). Do 1854. godine
Nedugo nakon toga, problematika je nz Nauck objavio i svoja
je dodao da postoje ukupno 60 rjeenja glavnog problema. Kasnije ukupno 92 rjeenja problema osam kraljica. U raspravu se
s idejom da postoje 72 rjeenja, ali i da pokuao generalizirati problem
nther je predloio metodu pronalaska koristei se determinantama iji je pristup kasnije uljepao
ukljuilo i jo nekoliko matematiara, ali naalost ima jako malo zapisa o njihovoj meusobnoj raspravi (Campbell,
uvelike su napravila dostupnost raunala o problem osam kraljica da ilustrira
mo onog to je on tada zvao strukturno programiranje. On je objavio veoma detaljan opis first backtracking algorithm (dubinsko unatrano pretraivanje) (Campbell,
, kao i njegovo poopenje na problem N kraljica, koristi u
kao praktina vjeba. Najea upotreba
klasian kombinatorni problem u podruju umjetne inteligencije, a
iz 19. stoljea. Desno: Johann Carl Friedrich Gauss, poznati njemaki
Problem osam kraljica
4
4 Primjena unatranog pretraivanja na
problem etiri kraljice
Za oekivati je da kompleksnost traganja za rjeenjem raste sa . to bi znailo da za
= 4 moemo bre i jednostavnije pronai sva rjeenja nego li za neki vei broj . Upravo
zbog tog razloga za prikazivanje algoritma kroz primjer razmjetaja kraljica na plou
dimenzije koristimo vrijednost = 4.
Dakle, problem se sastoji od ahovske ploe dimenzija 44 na koju trebamo postaviti
etiri kraljice tako da se one meusobno ne napadaju. Zbog potrebe u daljnjem tekstu,
koristit emo skraene nazive za etiri kraljice. Tako emo prvu kraljicu koju treba smjetiti na
plou nazvati K1, drugu K2, itd.
Prije upotrebe algoritma moramo definirati skup uvjeta i rjeenja koji zadovoljavaju
poetna pravila. Na primjer, postavljanje K1 na neko mjesto uvjetuje njen napad na neka
druga mjesta. Stoga postavljanje K2 na istu plou mora zadovoljiti prijanji uvjet i zauzeti
mjesto tako da nije pod napadom K1. Smjetanje K3 je malo tee jer istodobno mora
zadovoljiti postavljene uvjete od K1 i K2. Nastavljajui takvim nainom moe se dogoditi da
doemo do toke gdje skup svih prijanjih ogranienja ne dozvoljava da se idua kraljica
smjesti na plou. Zbog toga je potrebeno ublaiti uvjete i pronai nova rjeenja.
Ublaavanje se vri na nain da se vratimo barem jedan korak unatrag i pronaemo novo
dozvoljeno rjeenje, odnosno slijedeu moguu poziciju za prethodnu kraljicu. Drugim
rijeima, ako postavimo Ki na -tu kolonu i ne moemo pronai rjeenje za Ki+1 mi se vraamo
korak unatrag i pronalazimo prvo slijedee dozvoljeno rjeenje za Ki (Engelhardt, 2007.).
Vratimo se naem primjeru raspodjele etiri kraljice na plou dimenzija 44 tako da se
one meusobno ne napadaju. Za poetak postavljamo pravilo da svaka kraljica mora biti u
svojoj koloni, to e biti na poetni uvjet. Zatim kreiramo pseudo kod za algoritam:
PSEUDO KOD ZA ALGORITAM PRIJE UNATRANOG PRETRAIVANJA
1. Stavimo K1 na mjesto a1. 2. Nastavimo sa slijedeom kraljicom K2 i stavljamo je na mjesto b1. 3. U koloni b traimo prvo dozvoljeno mjesto za K2. 4. Postupak nastavljamo sa slijedeom kraljicom.
Kreemo s traenjem rjeenja. Kraljicu K
korak je traenje prvog slobodnog mjesta za K
Budui da postavljanje K2 na mjesto b
moramo se vratiti korak unatrag te potraiti sl
koloni. Drugim rjeima, postavljanjem K
daljnjim korakom vie ne moemo zadovoljiti
rjeenje. Zato smo morali preispitati uvjete i preurediti plou od one toke gdje smo zapeli
(postavljanje K2 u drugoj koloni). Uzimamo sl
(Slika 3 c)).
Sad moemo krenuti korak dalje s postavljanjem K
mjesto c2. Time smo doli do dijela
kolonu (Slika 3 d)). Dakle, postavljanje K
jedan korak unatrag nije bio dovoljan. Moramo s
K1.
Slika 3 Prikaz postavljanja etiri kraljice na ahovsku plou dimenzija postavljanje K1 u prvu kolonu na prvo slobodno mjesto a1, b) postavljanje Kuvaavajui uvjete algoritma, c) vrenje prvog unatranog pretraivanje zbog nemogunosti pronalaska daljnjeg rjeenja stvorenim prijanjim uvjetom i d) postavljanje Kdaljnjeg rjeavanja.
Kreemo s traenjem rjeenja. Kraljicu K1 stavljamo na poziciju a1 (Slika
korak je traenje prvog slobodnog mjesta za K2. U ovom sluaju to je mjesto b
na mjesto b3 uvjetuje nemogunost postavljanja K
moramo se vratiti korak unatrag te potraiti sljedee mogue slobodno mjesto za K
Drugim rjeima, postavljanjem K2 na mjesto b3 postavili smo uvjete na nain da ih
daljnjim korakom vie ne moemo zadovoljiti, a da istodobno pronaemo cjeloukupno
rjeenje. Zato smo morali preispitati uvjete i preurediti plou od one toke gdje smo zapeli
u drugoj koloni). Uzimamo sljedee mogue mjesto za K2
Sad moemo krenuti korak dalje s postavljanjem K3 u treu kolonu na jedino slobodno
2. Time smo doli do dijela kad shvaamo da ne moemo smjestiti K
d)). Dakle, postavljanje K2 na zadnje mogue mjesto nije po
dovoljan. Moramo se vratiti jo jedan korak unatrag
Prikaz postavljanja etiri kraljice na ahovsku plou dimenzija poevi s prvim slobodnim mjestom za Ku prvu kolonu na prvo slobodno mjesto a1, b) postavljanje K2 u drugu kolonu na prvo slobodno mjesto
uvaavajui uvjete algoritma, c) vrenje prvog unatranog pretraivanje zbog nemogunosti pronalaska daljnjeg rjeenja stavljanje K3 u treu kolonu na jedino slobodno mjesto i uoavanje nemogunosti
Problem osam kraljica
5
Slika 3 a)). Sljedei
. U ovom sluaju to je mjesto b3 (Slika 3 b)).
3 uvjetuje nemogunost postavljanja K3 u treu kolonu
jedee mogue slobodno mjesto za K2 u drugoj
uvjete na nain da ih
, a da istodobno pronaemo cjeloukupno
rjeenje. Zato smo morali preispitati uvjete i preurediti plou od one toke gdje smo zapeli
2, a to je mjesto b4
lonu na jedino slobodno
kad shvaamo da ne moemo smjestiti K4 u etvrtu
na zadnje mogue mjesto nije pomoglo. Stoga
e vratiti jo jedan korak unatrag. Dakle, na
poevi s prvim slobodnim mjestom za K1. a) u drugu kolonu na prvo slobodno mjesto
uvaavajui uvjete algoritma, c) vrenje prvog unatranog pretraivanje zbog nemogunosti pronalaska daljnjeg rjeenja u treu kolonu na jedino slobodno mjesto i uoavanje nemogunosti
Stavljamo K1 na mjesto a
slobodno mjesto b4 (Slika 4 b)). Zatim u treoj koloni postavimo K
Zadnji korak je postavljanje kraljice K
Time smo doli do jednog rjeenja problema. Za to nam je bilo potrebno obaviti dva
vraanja unatrag. Da bi pronali sva mogua rjeenja problema etiri kraljice takoer se
koristimo metodom unatranog
Krenemo od etvrte kolone gdje odmah uoavamo da
slobodno mjesto. Vratimo se na K
Vraajui se na K2 vidimo da ni u drugoj koloni nema dozvoljenih slobodnih
se vratili na kraljicu K1 u prvoj koloni.
Nastavljajui dalje s koracima koji su analogni kao i u prijanjem sluaju pronalazimo
jedno rjeenje (Slika 5) koje je u
kraljice na plou dimenzije 4
Slika 4 Prikaz postavljanja etiri kraljice na ahovsku plou dimenzija postavljanje K1 u prvu kolonu na drugo slobodno mjesto a2uvaavajui uvjete algoritma, c) postavljanje Kd3.
na mjesto a2 (Slika 4 a)) to uvjetuje postavljanje kraljice K
b)). Zatim u treoj koloni postavimo K3 na mjesto c
Zadnji korak je postavljanje kraljice K4 u etvrtu kolonu na mjesto d3 (Slika
Time smo doli do jednog rjeenja problema. Za to nam je bilo potrebno obaviti dva
vraanja unatrag. Da bi pronali sva mogua rjeenja problema etiri kraljice takoer se
koristimo metodom unatranog pretraivanja.
Krenemo od etvrte kolone gdje odmah uoavamo da za K4 ne postoji vie nijedno
. Vratimo se na K3 i vidimo da i tu ne postoji drugo slobodno mjesto.
vidimo da ni u drugoj koloni nema dozvoljenih slobodnih
u prvoj koloni. K1 postavljamo na slijedee slobodno mjesto, a
Nastavljajui dalje s koracima koji su analogni kao i u prijanjem sluaju pronalazimo
) koje je u biti rotacija prvog rjeenja. I zaista problem smje
4 ima samo jedno jedinstveno rjeenje.
tavljanja etiri kraljice na ahovsku plou dimenzija nakon prvih unatranih pretraivanjaslobodno mjesto a2, b) postavljanje K2 u drugu kolonu na jedino
postavljanje K3 na jedino slobodno mjesto c1 i d) postavljanje K4 na jedino slobodno mjesto
Problem osam kraljica
6
raljice K2 na jedino
na mjesto c1 (Slika 4 c)).
Slika 4 d)).
Time smo doli do jednog rjeenja problema. Za to nam je bilo potrebno obaviti dva
vraanja unatrag. Da bi pronali sva mogua rjeenja problema etiri kraljice takoer se
ne postoji vie nijedno
drugo slobodno mjesto.
vidimo da ni u drugoj koloni nema dozvoljenih slobodnih mjesta, ime smo
o na slijedee slobodno mjesto, a3.
Nastavljajui dalje s koracima koji su analogni kao i u prijanjem sluaju pronalazimo jo
rjeenja. I zaista problem smjetanja etiri
nakon prvih unatranih pretraivanja. a) u drugu kolonu na jedino slobodno mjesto b4
na jedino slobodno mjesto
Slika 5 Prikaz traenja sljedeeg mogueg rjeenja problema etiri kraljice koritenjem algoritma unatranog pretraivanjaa) postavljanje K1 u prvu kolonu na sljedeemjesto b1 uvaavajui uvjete algoritma, c) postavljanje Kslobodno mjesto d2.
Ostala nam je jo samo jedno slobodno mjesto za K
Daljnje traenje moguih rjeenja u tom sluaju anologno je kao i u prvom sluaju kad smo K
smjestili na mjesto A1. Ubrzo bi
Na takav nain smo istraili sva mogua
unatrano pretraivanje kod onih toaka kad nismo mogli pronai dozvoljavajua mjesta za
kraljicu Ki u i-toj koloni. Dakle, mi smo
bez daljnjeg testiranja. To i jest bit unatranog pretraivanja, kao to je pri
Slika 1. U suprotnom, ili smo dalje na sl
kraljicu u posljednju kolonu.
traenja sljedeeg mogueg rjeenja problema etiri kraljice koritenjem algoritma unatranog pretraivanjasljedee slobodno mjesto a3, b) postavljanje K2 u drugu kolonu na jedino slobodno
uvaavajui uvjete algoritma, c) postavljanje K3 na jedino slobodno mjesto c4 i d) postavljanje K
stala nam je jo samo jedno slobodno mjesto za K1 u prvoj koloni. To je mjesto a
Daljnje traenje moguih rjeenja u tom sluaju anologno je kao i u prvom sluaju kad smo K
smjestili na mjesto A1. Ubrzo bi smo shvatili da u tom sluaju takoer ne postoj
istraili sva mogua rjeenja. Kroz cijeli postupak koristili smo
unatrano pretraivanje kod onih toaka kad nismo mogli pronai dozvoljavajua mjesta za
toj koloni. Dakle, mi smo u tim tokama odbacili sve mogue potomke
. To i jest bit unatranog pretraivanja, kao to je pri
smo dalje na sljedeu kolonu sve dok nismo postavili
Problem osam kraljica
7
traenja sljedeeg mogueg rjeenja problema etiri kraljice koritenjem algoritma unatranog pretraivanja. u drugu kolonu na jedino slobodno
i d) postavljanje K4 na jedino
u prvoj koloni. To je mjesto a4.
Daljnje traenje moguih rjeenja u tom sluaju anologno je kao i u prvom sluaju kad smo K1
takoer ne postoji rjeenja.
Kroz cijeli postupak koristili smo
unatrano pretraivanje kod onih toaka kad nismo mogli pronai dozvoljavajua mjesta za
ogue potomke vora
. To i jest bit unatranog pretraivanja, kao to je prikazano na grafu na
jedeu kolonu sve dok nismo postavili posljednju
Problem osam kraljica
8
5 Implementacija unatranog pretraivanja na
problem 8 kraljica
Problem etiri kraljice se moe rijeiti doslovce na prste kao to se moe primijetiti u
prijanjem poglavlju. No to ako se broj kraljica povea? Da li bi mi imali vremena na prste
proi kroz sve mogunosti za pronalaenje rijeenja ili problemu moemo pristupiti na jedan
malo drugaiji nain?
5.1 Mogua rjeenja problema osam kraljica
Pogledajmo problem osam kraljica koje je potrebno razmjestiti na plou dimenzija 88.
U takvom sluaju postoji 4426165368moguih razmjetaja. Broj se lako dobije primjenom
osnova kombinatorne matematike. Budui da ploa ima 64 polja, postoje 64 slobodnih
mjesta na koja moemo postaviti prvu kraljicu. Nakon postavljanja prve kraljice, za drugu
ostaju 63 slobodna mjesta. Za ostalih est kraljica primjenimo analogno pravilo. Tako za
zadnju kraljicu (osmu) ostaje (64 7)slobodnih mjesta. Kako se sve kraljice tretiraju kao isti
objekt njihov raspored je nevaan stoga dobiveni broj moramo podjeliti sa 8!.
64 63 62 61 60 59 58 57
8!= 4426165368
No rjeenja problema unato velikom broju moguih razmjetaja ima samo 92. Kad bi mi
ili preispitati svaki od moguih razmjetaja osam kraljica, pa ak koristei se raunalom,
trebalo bi nam jako puno vremena. Da bi se smanjila raunalna upotreba pri traenju
rjeenja mogu se koristiti preaci kao to je primjena jednostavnog poetnog pravila da se
svaka kraljica ogranii na samo jednu kolonu (ili jedan redak). U tom sluaju broj mogunosti
e se smanjiti na 16777216, odnosno 8 moguih razmjetaja to je skoro 264 puta manje
moguih razmjetaja. Stvarajui permutacije koja daju mogua rjeenja problema osam
kraljica, a zatim jo i provjeravanje na njihova dijagonalna napadanja smanjuje mogunost
razmjeanja kraljica na samo 40320 odnosno 8! moguih razmjetaja.
Naravno, to je jo uvijek velik broj mogunosti za testiranje na prste, stoga za ovakav
problem koristimo raunala. U daljnjem tekstu ovog rada nalazi se primjena unatranog
pretraivanja u JavaScript programskom jeziku na problem osam kraljica.
Problem osam kraljica
9
5.2 Programska podrka
Za implementaciju unatranog pretraivanja na problem osam kraljica koristimo dvije
programske podrke: JavaScript i KineticJS. JavaScript programski jezik nam slui za
implementaciju algoritma unatranog pretraivanja, te za pisanje dodatnih funkcija kojima
kontroliramo samu izvedbu web aplikacije, dok nam KineticJS razvojno okruenje koristi da
vizualno prikaemo definiranu ahovsku plou, kraljice, te pokretanje i postavljanje kraljica
na plou.
5.2.1 JavaScript
JavaScript (JS) je kompaktni, skriptni programski jezik. Najpoznatiji je po koritenju za
razvoj web stranica i web aplikacija koje se izvravaju unutar web preglednika na strani
korisnika (eng. client). Time omoguava interakciju sa korisnikom, a samim time izmjenu
dokumenta koji je prikazan. Takoer, JavaScript je mogue koristiti i na strani posluitelja
(eng. server), no to nije toliko est sluaj. Jezik je osmislio i razvio Brendan Eich u tvrtci
Netscape pod imenom Mocha, dok je slubeni naziv bio LiveScript. Kasnije su ga
preimenovali u JavaScript (Wikipedia, JavaScript).
Jedna od najznaajnijih upotreba JavaScript-a jest pisanje funkcija koje su ukljuene
unutar HTML (eng. HyperText Markup Language) stranice, a koje HTML ne moe izvriti. To
se esto naziva DHTML (eng. Dynamic HTML).
5.2.2 KineticJS
KineticJS je JavaScript razvojno okruenje koje na HTML5 platnu (HTML5 Canvas)
koristi objektno orijentiranu paradigmu programiranja te samim time omoguava
jednostavno koritenje animacija, tranzicija i kontroliranja dogaaja nad objektima poput
slika, teksta, kvadratnih i pravokutnih kontura te mnogih drugih unutar mobilnih ili desktop
aplikacija (Slika 6) (Wikipedia, KineticJS).
Slika 6 Primjer igre razvijene KineticJS razvojnim okruenjem.
5.3 Upotreba JavaScript
Za pronalaenje svih rjeenja problema osam kraljica koristili smo implementac
JavaScript programskog jezika na rekurzivni b
pretraivanja). U samom poetku smo definirali
poetni uvjet prvim pravilom da se u jednom stupcu smije nalaziti samo jedna kraljica
proirenje na uvjet da u svakom slijedeem stupcu promatramo s
uvjetovana prvim pravilom. Na takav nain smo unaprijed izbjegli ona mjesta koja
kraljice iz prethodnih stupaca.
Algoritam kojim pronalazimo rjeenje problema
dijelu se vri provjera zadovoljavanja proirenog uvjeta
rekurzija kojom se pomiemo naprijed odnosno unatrag pri traenju rjeenja.
PSEUDO KOD ZA PROVJERU ZADOVOLJENOSTI UVJETA
1. Ako se nalazimo u prvom stupcu, uvjet je zadovoljen2. Za svaki idui stupac, provjeravamo da li prethodne kraljice napadaju trenutno
mjesto.
Primjer igre razvijene KineticJS razvojnim okruenjem.
Upotreba JavaScript-e na problem osam kraljica
Za pronalaenje svih rjeenja problema osam kraljica koristili smo implementac
JavaScript programskog jezika na rekurzivni backtrack algoritam (algori
. U samom poetku smo definirali plou dimenzija 88. Zatim smo
poetni uvjet prvim pravilom da se u jednom stupcu smije nalaziti samo jedna kraljica
da u svakom slijedeem stupcu promatramo samo slobodna mjesta
uvjetovana prvim pravilom. Na takav nain smo unaprijed izbjegli ona mjesta koja
e iz prethodnih stupaca.
kojim pronalazimo rjeenje problema se sastoji od dva vana dijela.
voljavanja proirenog uvjeta, dok se u drugom dijelu algoritma vri
rekurzija kojom se pomiemo naprijed odnosno unatrag pri traenju rjeenja.
PSEUDO KOD ZA PROVJERU ZADOVOLJENOSTI UVJETA
u prvom stupcu, uvjet je zadovoljen.
Za svaki idui stupac, provjeravamo da li prethodne kraljice napadaju trenutno
Problem osam kraljica
10
na problem osam kraljica
Za pronalaenje svih rjeenja problema osam kraljica koristili smo implementaciju
(algoritam unatranog
Zatim smo postavili
poetni uvjet prvim pravilom da se u jednom stupcu smije nalaziti samo jedna kraljica, uz
amo slobodna mjesta
uvjetovana prvim pravilom. Na takav nain smo unaprijed izbjegli ona mjesta koja napadaju
se sastoji od dva vana dijela. U prvom
dok se u drugom dijelu algoritma vri
rekurzija kojom se pomiemo naprijed odnosno unatrag pri traenju rjeenja.
Za svaki idui stupac, provjeravamo da li prethodne kraljice napadaju trenutno
Problem osam kraljica
11
3. Ako je trenutno mjesto napadnuto od nekih prethodnih kraljica, uvjet nije zadovoljen.
4. Ako nijedna od prethodnih kraljica ne napada trenutno mjesto, uvjet je zadovoljen.
Najbitniji dio algoritma je onaj koji sadri u sebi rekurziju. Stoga se u njegovom svakom
koraku pozivamo na provjeru zadovoljenosti uvjeta. Ako je uvjet zadovoljen, program stavlja
kraljicu na trenutno mjesto i nastavlja sa sljedeim korakom. U protivnom se nastavlja
algoritam bez sputanja kraljice na zabranjeno mjesto. Dakle, ni u jednom sluaju nema
prekida izvoenja algoritma.
PSEUDO KOD ZA REKURZIVNI BACKTRACK
1. Kreemo od prvog retka u prvom stupcu. 2. Ako je proireni uvjet zadovoljen, kraljica se postavlja na trenutno mjesto i poziva se
algoritam za idui stupac. Vraamo se na korak 2.
3. Ukoliko uvjet nije zadovoljen, u istom stupcu se pomiemo se na sljedei redak i vraamo se na korak 2.
4. Ako se uvjet nije uspio zadovoljiti niti na zadnjem redku u danom stupcu, algoritam se rekurzivno se vratia na prethodni stupac, gdje se postavljena kraljica pomie na idui
redak u tom stupcu i vraamo se na korak 2.
5. Ukoliko smo stigli do zadnjeg stupca gdje je uvjet zadovoljen, algoritam je pronaao jedno rjeenje te se vraa na prethodni stupac gdje se kraljica pomie u idui redak.
Vraamo se na korak 2.
Problem osam kraljica
12
6 Rjeenja problema osam kraljica
Iako problem osam kraljica ima 92 razliitih rjeenja samo je 12 od njih jedinstveno (Slika
7). Svako jedinstveno rjeenje sadri osam varijanti, ukljuujui i originalan oblik, koje se
dobiju rotacijom za 90, 180 ili 270 stupnjeva te zrcaljenjem svake od etiri rotirajue
varijante (kao to je bio sluaj i za problem etiri kraljice). Meutim, ako je rjeenje
ekvivalentno njegovoj rotaciji za 90 stupnjeva onda jedinstveno rjeenje ima samo dvije
varijante, sebe i svoje zrcaljenje. Ako je rjeenje ekvivalent rjeenja dobivenog rotacijom za
180 stupnjeva (ali ne rotaciji za 90 stupnjeva) onda jedinstveno rjeenje ima etiri varijante,
sebe, svoje zrcaljenje, rotaciju za 90 stupnjeva te njeno zrcaljenje. Sluaj u kome je
jedinstveno rjeenje ekvivalentno svom zrcaljenju odbacujemo jer bi to znailo da se neke od
kraljica meusobno napadaju. Od 12 jedinstvenih rjeenja problema osam kraljica na ploi
88, tono jedno je jednako svojoj rotaciji za 180 stupnjeva i niti jedno nije jednako svojoj
rotaciji za 90 stupnjeva iz ega je ukupan broj razliitih rjeenja 11 8 + 1 4 = 92
(Wikipedia, Backtracking).
Slika 7 Grafiki prikaz 12 jedinstvenih rjeenja kod problema osam kraljica.
Problem osam kraljica
13
U sluaju problema kraljica broj jedinstvenih i ukupnih rjeenja prikazani su u Tablica 1. Broj ukupnih rjeenja raste s porastom broja , kao i broj jedinstvenih rjeenja iako je on uvijek manji od broja ukupnog rjeenja za dani . U sluaju , , , problem se moe rijeiti na prste, dok je za > 4 potrebna sofisticiranija metoda. Backtracking algoritam se pokazao kao korisna metoda za pronalazak rjeenja do < 20, no za $ koritenje metode je sporo. Npr., pokazalo se da je za = , gdje ima ukupno 128 850 048 moguih rjeenja, koritenjem algoritma unatranog pretraivanja potrebno 267 dana (Rivin et al., 1992.). U takvim sluajevima zgodnije se okrenuti modernijim pristupima heuristikim algoritmima koji daju rjeenje na problem kraljica bez ogromne upotrebe raunala, kao npr. koritenje genetskog algoritma (Homaifar et al., 1992.).
Kao to je i bilo za oekivati za = i = ne postoji niti jedno rjeenje. Takoer je zanimljivo primjetiti kako problem est kraljica ima manje rjeenja nego problem pet kraljica.
Tablica 1 Broj ukupnih i jedinstvenih rjeenja za razliite brojeve N problema N kraljica.
N Br. ukupnih rjeenja Br. jedinstenih rjeenja
1 1 1
2 0 0
3 0 0
4 2 1
5 10 2
6 4 1
7 40 6
8 92 12
9 352 46
10 724 92
11 2 680 341
12 14 200 1 787
13 73 712 9 233
14 365 596 45 752
25 2 207 893 435 808 352 275 986 683 743 434
26 22 317 699 616 364 044 2 789 712 466 510 589
Problem osam kraljica
14
7 Zakljuak
Algoritam unatranog pretraivanja (backtracking) je vrlo korisna metoda za pronalazak
rjeenja odreenih problema, a ponekad i veoma kompleksnih. Metoda zahtijeva istraivanje
svakog mogueg sluaja danog problema, stoga moemo rei da je u tom pogledu veoma
precizna jer ne doputa mjesto pogreci. Upravo zbog te odlike ona je relativno spora ovisno
o danom problemu. Koritenje metode unatranog pretraivanja u sluaju pronalaska svih
moguih rjeenja problema 23 kraljice uz raunalnu pomo bilo je potrebno ukupno 267
dana. No za pronalazak svih rjeenja problema N kraljica, gdje je N
Problem osam kraljica
15
8 Literatura
Campbell P.J. (1977): Gauss and the Eight Queens problem: A study in miniature of the
propagation of historical error, Historia Mathematica, WI 53511, 397-404, USA
Engelhardt M.R. (2007): A group-based search for solutions of the n-queens problem,
Discrete Mathematics 307, 2535-2551, Nuernberg, Germany
Homaifar A., Turner J., Ali S. (1992.): Genetic Algorithms and The N-Queen Problem,The IEEE
Proceedings of the Southeast Con, 262-267, Birmingham
Rivin I., Vardi I., Zimmermann P. (1992.): The n-Queens Problem, Mathematical Association
of America, Vol. 101, No.7, 629-639, USA
Wikipedia (27. 6. 2013.), Backtracking, http://en.wikipedia.org/wiki/Backtracking
Wikipedia (12. 8. 2013.), Eight queens puzzle,
http://en.wikipedia.org/wiki/Eight_queens_puzzle
Wikipedia (15. 9. 2013.), Java Script, http://en.wikipedia.org/wiki/JavaScript
Kinetic JS, www.kineticjs.com
Literatura slika:
Treebeard's Stumper Answer (4. 2. 2000.),
www.rain.org/~mkummel/stumpers/04feb00a.html
Wikipedia (23. 4. 2013.), Max Bezzel, http://en.wikipedia.org/wiki/Max_Bezzel
Johann Carl Friedrich Gauss, www.rare-earth-magnets.com/t-johann-carl-friedrich-
gauss.aspx
Problem osam kraljica
16
9 Prilozi
9.1 Dodatak I dijelovi programskog koda
Problem osam kraljica
function _2dpolje(temp) /* stvaramo dvodimenzionalno polje [temp][temp] */
{
var array = [];
for (var i=0;i
Problem osam kraljica
17
if(kraljica.getX() > 100 && kraljica.getX() < (100 + 8*80) &&
kraljica.getY() > 40 && kraljica.getY() < (40 + 8*80))
{
return true;
}
else
{
return false;
}
}
/*
"podizanjem" kraljice se poziva ova funkcija koja nam vizualno prikae
onemoguena polja
*/
function _onemoguci_polja_na_ploci_osim_kraljice(kraljica)
{
onemoguciLayer.removeChildren();
onemoguciLayer.draw();
for(var j = 0; j < 8; j++)
{
for(var k = 0; k < 8; k++)
{
nizOnemoguceniPolja[j][k] = false;
}
}
for(var i = 0; i < 8; i++)
{
if(kraljica.getId() != kraljice[i].getId())
{
if(kraljica_u_ploci(kraljice[i]))
{
var x_koordinata_kraljice = Math.floor((kraljice[i].getX()
- 100) / 80);
var y_koordinata_kraljice = Math.floor((kraljice[i].getY()
- 40) / 80);
var temp_x_desna_kosa;
var temp_y_desna_kosa;
var temp_x_lijeva_kosa;
var temp_y_lijeva_kosa;
if(x_koordinata_kraljice >= y_koordinata_kraljice)
{
temp_x_desna_kosa = x_koordinata_kraljice -
y_koordinata_kraljice;
temp_y_desna_kosa = 0;
}
else
{
temp_x_desna_kosa = 0;
temp_y_desna_kosa = y_koordinata_kraljice -
x_koordinata_kraljice;
}
for (var m=0; m
Problem osam kraljica
18
nizOnemoguceniPolja[m][n] = true;
var tempRect = new Kinetic.Rect({
x: 100 + 80*m + 30,
y: 40 + 80*n + 30,
width: 20,
height: 20,
fill: "brown",
stroke: "black",
strokeWidth: 3,
draggable: false
});
onemoguciLayer.add(tempRect);
}
if(m == temp_x_desna_kosa && n ==
temp_y_desna_kosa)
{
nizOnemoguceniPolja[m][n] = true;
var tempRect = new Kinetic.Rect({
x: 100 + 80*m + 30,
y: 40 + 80*n + 30,
width: 20,
height: 20,
fill: "brown",
stroke: "black",
strokeWidth: 3,
draggable: false
});
onemoguciLayer.add(tempRect);
temp_x_desna_kosa++;
temp_y_desna_kosa++;
}
}
}
if(x_koordinata_kraljice >= y_koordinata_kraljice)
{
temp_x_lijeva_kosa = x_koordinata_kraljice +
y_koordinata_kraljice;
temp_y_lijeva_kosa = 0;
}
else (x_koordinata_kraljice < y_koordinata_kraljice)
{
temp_x_lijeva_kosa = 7;
temp_y_lijeva_kosa = x_koordinata_kraljice +
y_koordinata_kraljice - 7;
}
while(temp_x_lijeva_kosa >= 0 && temp_y_lijeva_kosa = 0 && temp_x_lijeva_kosa = 0 && temp_y_lijeva_kosa
Problem osam kraljica
19
height: 20,
fill: "brown",
stroke: "black",
strokeWidth: 3,
draggable: false
});
onemoguciLayer.add(tempRect);
}
temp_x_lijeva_kosa--;
temp_y_lijeva_kosa++;
}
onemoguciLayer.draw();
}
}
}
}
function testPloce() /* koristimo kod izrauna raunanja kordinata nakon
"sputanja" kraljice */
{
for(var j = 0; j < 8; j++)
{
for(var i = 0; i < 8; i++)
{
if(stage.getPointerPosition().x > nizPoljaPloce[j][i].getX() &&
stage.getPointerPosition().x < (nizPoljaPloce[j][i].getX() + 80) &&
stage.getPointerPosition().y > nizPoljaPloce[j][i].getY() &&
stage.getPointerPosition().y < (nizPoljaPloce[j][i].getY() + 80))
{
if(nizOnemoguceniPolja[i][j]==false)
{
return true;
}
}
}
}
return false;
}
/*
Raunamo kordinate kraljice nakon "sputanja" u ovisnosti o tome da li
kraljicu
sputamo unutar ploe, izvan ploe ili na onemoguenom polju. Ako je na
omoguenom polju, raunamo "centar"
polja, u suprotnom vraamo je na poetnu poziciju.
*/
function izracunaj_Kordinate(kraljica)
{
if(testPloce())
{
var temp1 = stage.getPointerPosition().x - 100;
temp1 = Math.floor(temp1 / 80)*80 + 110;
var temp2 = stage.getPointerPosition().y - 40;
temp2 = Math.floor(temp2 / 80)*80 + 40 + 10;
xy[0] = temp1;
xy[1] = temp2;
}
else
{
Problem osam kraljica
20
if(stage.getPointerPosition().x > 100 &&
stage.getPointerPosition().x < (100 + 8*80) && stage.getPointerPosition().y
> 40 && stage.getPointerPosition().y < (40 + 8*80))
{
xy[0] = trenutniX[kraljica.getId()];
xy[1] = trenutniY[kraljica.getId()];
}
else
{
xy[0] = niz_pocetniX[kraljica.getId()];
xy[1] = niz_pocetniY[kraljica.getId()];
}
}
}
/* POSTAVI PLOCU */
function postavi_plocu(){
for (var j=0; j
Problem osam kraljica
21
lista_koraka[korak++] = {x: (stupac + 1), y:
(position[stupac]+1)};
Algoritam(stupac+1);
}
}
}
}
/* SIMULACIJA */
function pokreni_simulaciju(temp){
korak = temp;
for( j = (lista_koraka[korak].x); j
var x_polje = 100;
var y_polje = 40;
var xy = [];
/*
Stvaramo pozornicu na kojoj emo dodavati slojeve, grupe
slojeva na koje
emo dodavati razne objekte poput slika (crno polje, bijelo
polje, kraljica),
teksta i pravokutnika
*/
var stage = new Kinetic.Stage({
container: 'container',
width: 1240,
Problem osam kraljica
22
height: 800
});
var plocaLayer = new Kinetic.Layer();
var kraljiceLayer = new Kinetic.Layer();
var onemoguciLayer = new Kinetic.Layer();
var textLayer = new Kinetic.Layer();
var sideTextLayer = new Kinetic.Layer();
var rjesenjaTextLayer = new Kinetic.Layer();
var group_postavi_plocu = new Kinetic.Group();
var group_prikaz_rjesenja = new Kinetic.Group();
var group_simuliraj = new Kinetic.Group();
/*
Definiramo varijable nizova koje emo koristiti.
*/
var kraljice = [];
var niz_pocetniX = [];
var niz_pocetniY = [];
var trenutniX = [];
var trenutniY = [];
var nizPoljaPloce = _2dpolje(8);
var nizOnemoguceniPolja = _2dpolje(8);
_postaviNiz();
/*
Dodajemo slojeve na nau pozornicu
*/
stage.add(rjesenjaTextLayer);
stage.add(sideTextLayer);
stage.add(textLayer);
stage.add(plocaLayer);
stage.add(onemoguciLayer);
stage.add(kraljiceLayer);
/*
Uitavamo slike koje emo prikazivati (crno polje, bijelo
polje, kraljica)
*/
var imageObj = new Image();
imageObj.onload = function() {
stage.draw();
}
imageObj.src = 'resources/kraljica.png';
var imageCrnoPolje = new Image();
imageCrnoPolje.onload = function() {
stage.draw();
}
imageCrnoPolje.src = 'resources/crnoPolje.png';
var imageBijeloPolje = new Image();
imageBijeloPolje.onload = function() {
stage.draw();
}
imageBijeloPolje.src = 'resources/bijeloPolje.png';
/*
Koristei objekte pravokutnika i teksta kreiramo tekst sa
strane tako da
objekte strateki pozicioniramo po x, y kordinatama. Prvo
stvaramo naslov,
zatim sam tekst koji se ispisuje i na kraju pravokutni okvir
koje dodajemo
na ve postojei sloj na pozornici. Na isti nain kreiramo
okvir za rjeenja.
*/
var sideText_naslov = new Kinetic.Text({
Problem osam kraljica
23
x: 100 + 8*80 + 130,
y: 40,
text: 'Problem 8 kraljica',
fontSize: 22,
fontFamily: 'Calibri',
fontStyle: 'bold',
fill: '#555',
width: 340,
padding: 20,
align: 'center'
});
var sideText = new Kinetic.Text({
x: 100 + 8*80 + 130,
y: sideText_naslov.getHeight(),
text: '\nRasporedite svih 8 kraljica na ahovsku plou tako da
ni jedna ne napada drugu.',
fontSize: 18,
fontFamily: 'Calibri',
fill: '#555',
width: 340,
padding: 20,
align: 'center'
});
var sideTextPolje = new Kinetic.Rect({
x: 100 + 8*80 + 130,
y: 40,
stroke: '#555',
strokeWidth: 3,
fill: '#ddd',
width: 340,
height: sideText_naslov.getHeight() + sideText.getHeight() -
40,
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 10,
shadowOpacity: 0.2,
cornerRadius: 3
});
sideTextLayer.add(sideTextPolje);
sideTextLayer.add(sideText_naslov);
sideTextLayer.add(sideText);
var rjesenja = '';
function ispis_rjesenja(){
rjesenjaTextLayer.removeChildren();
var rjesenjaText_naslov = new Kinetic.Text({
x: 100 + 8*80 + 130,
y: 225,
text: '92 rjeenja : ',
fontSize: 16,
fontFamily: 'Calibri',
fontStyle: 'bold',
fill: '#555',
width: 340,
padding: 20,
align: 'left'
});
var rjesenjaText = new Kinetic.Text({
x: 100 + 8*80 + 130,
y: 190 + rjesenjaText_naslov.getHeight(),
text: rjesenja,
Problem osam kraljica
24
fontSize: 15,
fontFamily: 'Calibri',
fontStyle: 'bold',
fill: '#555',
width: 270,
padding: 20,
align: 'left'
});
var rjesenjaTextPolje = new Kinetic.Rect({
x: 100 + 8*80 + 130,
y: 225,
stroke: '#555',
strokeWidth: 3,
fill: '#ddd',
width: 340,
height: rjesenjaText_naslov.getHeight() +
rjesenjaText.getHeight() - 40,
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 10,
shadowOpacity: 0.2,
cornerRadius: 3
});
rjesenjaTextLayer.add(rjesenjaTextPolje);
rjesenjaTextLayer.add(rjesenjaText);
rjesenjaTextLayer.add(rjesenjaText_naslov);
rjesenjaTextLayer.add(group_simuliraj);
rjesenjaTextLayer.draw();
}
/*
Kreiramo grupu objekata koji zajedno ine botun "Postavi plou"
koji se sastoji od
teksta i okvira. Nadalje grupa kao cjelina ima svoje dogaaje
koje smo stvorili
nakon to smo dodali objekte u grupu. Unutar svakog dogaaja se
odvija zasebna
JavaScript funkcija. Grupu na kraju dodajemo na ve postojei
sloj unutar pozornice.
*/
var postavi_plocu_text = new Kinetic.Text({
x: 100 + 8*80 + 130,
y: 40 + sideTextPolje.getHeight() + 10,
fontSize: 20,
text: 'Postavi plou',
fontFamily: 'Calibri',
fontStyle: 'bold',
fill: 'grey',
width: 160,
padding: 5,
align: 'center'
});
var postavi_plocu_okvir = new Kinetic.Rect({
x: 100 + 8*80 + 130,
y: 40 + sideTextPolje.getHeight() + 10,
width:160,
height: postavi_plocu_text.getHeight(),
stroke: 'grey',
strokeWidth: 3,
fill: 'WhiteSmoke',
shadowColor: 'black',
Problem osam kraljica
25
shadowBlur: 10,
shadowOffset: 5,
shadowOpacity: 0.2,
cornerRadius: 3
});
group_postavi_plocu.add(postavi_plocu_okvir);
group_postavi_plocu.add(postavi_plocu_text);
group_postavi_plocu.on('mouseover', function() {
document.body.style.cursor = 'pointer';
postavi_plocu_okvir.setFill('FloralWhite');
sideTextLayer.draw();
});
group_postavi_plocu.on('mousedown', function() {
document.body.style.cursor = 'pointer';
postavi_plocu_text.setFill('green');
postavi_plocu_okvir.setStroke('green');
postavi_plocu_okvir.setFill('FloralWhite');
postavi_plocu_okvir.setShadowColor('green');
sideTextLayer.draw();
});
group_postavi_plocu.on('mouseup', function() {
document.body.style.cursor = 'pointer';
postavi_plocu_text.setFill('grey');
postavi_plocu_okvir.setStroke('grey');
postavi_plocu_okvir.setFill('FloralWhite');
postavi_plocu_okvir.setShadowColor('grey');
sideTextLayer.draw();
});
group_postavi_plocu.on('mouseout', function() {
document.body.style.cursor = 'default';
postavi_plocu_text.setFill('grey');
postavi_plocu_okvir.setStroke('grey');
postavi_plocu_okvir.setFill('WhiteSmoke');
postavi_plocu_okvir.setShadowColor('grey');
sideTextLayer.draw();
});
group_postavi_plocu.on('click', function() {
postavi_plocu();
});
sideTextLayer.add(group_postavi_plocu);
/*
Kreiramo grupu objekata koji zajedno ine botun "Prikaz
rjeenja" koji se sastoji od
teksta i okvira. Nadalje grupa kao cjelina ima svoje dogaaje
koje smo stvorili
nakon to smo dodali objekte u grupu. Unutar svakog dogaaja se
odvija zasebna
JavaScript funkcija. Grupu na kraju dodajemo na ve postojei
sloj unutar pozornice.
*/
var prikaz_rjesenja_text = new Kinetic.Text({
x: 100 + 8*80 + 310,
y: 40 + sideTextPolje.getHeight() + 10,
fontSize: 20,
text: 'Prikaz rjeenja',
fontFamily: 'Calibri',
fontStyle: 'bold',
fill: 'grey',
width: 160,
padding: 5,
Problem osam kraljica
26
align: 'center'
});
var prikaz_rjesenja_okvir = new Kinetic.Rect({
x: 100 + 8*80 + 310,
y: 40 + sideTextPolje.getHeight() + 10,
width:160,
height: prikaz_rjesenja_text.getHeight(),
stroke: 'grey',
strokeWidth: 3,
fill: 'WhiteSmoke',
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 5,
shadowOpacity: 0.2,
cornerRadius: 3
});
group_prikaz_rjesenja.add(prikaz_rjesenja_okvir);
group_prikaz_rjesenja.add(prikaz_rjesenja_text);
group_prikaz_rjesenja.on('mouseover', function() {
document.body.style.cursor = 'pointer';
prikaz_rjesenja_okvir.setFill('FloralWhite');
sideTextLayer.draw();
});
group_prikaz_rjesenja.on('mousedown', function() {
document.body.style.cursor = 'pointer';
prikaz_rjesenja_text.setFill('green');
prikaz_rjesenja_okvir.setStroke('green');
prikaz_rjesenja_okvir.setFill('FloralWhite');
prikaz_rjesenja_okvir.setShadowColor('green');
sideTextLayer.draw();
});
group_prikaz_rjesenja.on('mouseup', function() {
document.body.style.cursor = 'pointer';
prikaz_rjesenja_text.setFill('grey');
prikaz_rjesenja_okvir.setStroke('grey');
prikaz_rjesenja_okvir.setFill('FloralWhite');
prikaz_rjesenja_okvir.setShadowColor('grey');
sideTextLayer.draw();
});
group_prikaz_rjesenja.on('mouseout', function() {
document.body.style.cursor = 'default';
prikaz_rjesenja_text.setFill('grey');
prikaz_rjesenja_okvir.setStroke('grey');
prikaz_rjesenja_okvir.setFill('WhiteSmoke');
prikaz_rjesenja_okvir.setShadowColor('grey');
sideTextLayer.draw();
});
group_prikaz_rjesenja.on('click', function() {
rjesenja = '';
postavi_plocu();
Algoritam(0);
});
sideTextLayer.add(group_prikaz_rjesenja);
var simuliraj_rjesenja_text = new Kinetic.Text({
x: 100 + 8*80 + 315,
y: 235,
fontSize: 16,
text: 'Simuliraj',
fontFamily: 'Calibri',
fontStyle: 'bold',
Problem osam kraljica
27
fill: 'grey',
width: 150,
padding: 5,
align: 'center'
});
var simuliraj_rjesenja_okvir = new Kinetic.Rect({
x: 100 + 8*80 + 315,
y: 235,
width:150,
height: simuliraj_rjesenja_text.getHeight(),
stroke: 'grey',
strokeWidth: 3,
fill: 'WhiteSmoke',
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 5,
shadowOpacity: 0.2,
cornerRadius: 3
});
group_simuliraj.add(simuliraj_rjesenja_okvir);
group_simuliraj.add(simuliraj_rjesenja_text);
group_simuliraj.on('mouseover', function() {
document.body.style.cursor = 'pointer';
simuliraj_rjesenja_okvir.setFill('FloralWhite');
rjesenjaTextLayer.draw();
});
group_simuliraj.on('mousedown', function() {
document.body.style.cursor = 'pointer';
simuliraj_rjesenja_text.setFill('green');
simuliraj_rjesenja_okvir.setStroke('green');
simuliraj_rjesenja_okvir.setFill('FloralWhite');
simuliraj_rjesenja_okvir.setShadowColor('green');
rjesenjaTextLayer.draw();
});
group_simuliraj.on('mouseup', function() {
document.body.style.cursor = 'pointer';
simuliraj_rjesenja_text.setFill('grey');
simuliraj_rjesenja_okvir.setStroke('grey');
simuliraj_rjesenja_okvir.setFill('FloralWhite');
simuliraj_rjesenja_okvir.setShadowColor('grey');
rjesenjaTextLayer.draw();
});
group_simuliraj.on('mouseout', function() {
document.body.style.cursor = 'default';
simuliraj_rjesenja_text.setFill('grey');
simuliraj_rjesenja_okvir.setStroke('grey');
simuliraj_rjesenja_okvir.setFill('WhiteSmoke');
simuliraj_rjesenja_okvir.setShadowColor('grey');
rjesenjaTextLayer.draw();
});
group_simuliraj.on('click', function() {
pokreni_simulaciju(0);
});
/*
Na ve postojei sloj kraljica "kraljiceLayer" dodajemo 8
kraljica sa njihovim dogaajima.
Nadalje na sloj ploe "plocaLayer" dodajemo crno, bijela polja.
Te na sloj teksta "textLayer"
dodajemo vizualne pozicije polja.
Problem osam kraljica
28
Petlja se pomie tako da index j predstavlja redak, a index i
predstavlja stupac. Stupaca ima
9 jer su u devetom stupcu poetne pozicije kraljica sa strane
ploe.
*/
for (var j=0; j
Problem osam kraljica
29
document.body.style.cursor = 'default';
this.setShadowColor('black');
kraljiceLayer.draw();
});
kraljiceLayer.add(kraljice[j]);
}
else
{
if(j == 0) /*Ako smo u prvom retku dodajemo slova a,b,c
...*/
{
var donjiText = new Kinetic.Label({
x: x_polje + 40,
y: y_polje,
opacity: 0.75,
listening: false,
text: {
text: String.fromCharCode(97 + i),
fontFamily: 'Calibri',
fontSize: 18,
fontStyle: 'bold',
padding: 5,
fill: 'white'
},
rect: {
fill: 'black',
pointerDirection: 'down',
pointerWidth: 10,
pointerHeight: 10,
lineJoin: 'round',
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 10,
shadowOpacity: 0.5
}
});
textLayer.add(donjiText);
}
if(i == 0) /*Ako smo u prvom stupcu dodajemo brojke
8,7,6 ...*/
{
var lijeviText = new Kinetic.Label({
x: x_polje,
y: y_polje + 40,
opacity: 0.75,
listening: false,
text: {
text: '' + (8-j),
fontFamily: 'Calibri',
fontSize: 18,
fontStyle: 'bold',
padding: 5,
fill: 'white'
},
rect: {
fill: 'black',
pointerDirection: 'right',
pointerWidth: 10,
pointerHeight: 10,
lineJoin: 'round',
Problem osam kraljica
30
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 10,
shadowOpacity: 0.5
}
});
textLayer.add(lijeviText);
}
/*
Logiki raspisani uvjeti temeljem kojih dodajemo
crno odnosno bijelo polje.
Svako polje ima jedan atribut, koji je
"implementiran", pozivanjem funkcija iz zaglavlja,
u obliku niza koji nam govori na koja polja moemo,
a na koja ne moemo spusititi kraljicu.
*/
if( ((i%2 == 1) && (j%2 == 1)) || ((i%2 == 0) && (j%2
== 0)) ) {
nizPoljaPloce[j][i] = new Kinetic.Image({
id: "" + (j + 1) + (i + 1),
x: x_polje,
y: y_polje,
width: 80,
height: 80,
image: imageCrnoPolje,
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 10,
shadowOpacity: 0.5
});
plocaLayer.add(nizPoljaPloce[j][i]);
}
if( ((i%2 == 1) && (j%2 == 0)) ||((i%2 == 0) && (j%2 ==
1)) ) {
nizPoljaPloce[j][i] = new Kinetic.Image({
id: "" + (j + 1) + (i + 1),
x: x_polje,
y: y_polje,
width: 80,
height: 80,
image: imageBijeloPolje,
shadowColor: 'black',
shadowBlur: 10,
shadowOffset: 10,
shadowOpacity: 0.5
});
plocaLayer.add(nizPoljaPloce[j][i]);
}
}
}
}