of 32 /32
SVEUČILIŠTE U SPLITU PRIRODOSLOVNO-MATEMATIČKI FAKULTET PROBLEM OSAM KRALJICA Stefan Dunić Mentor: prof.dr.sc. Slavomir Stankov Neposredni voditelj: dr.sc. Ani Grubišić Split, listopad 2013.

PROBLEM OSAM KRALJICA - mapmf.pmfst.unist.hrmapmf.pmfst.unist.hr/~ani/radovi/zavrsni/Stefan-Dunic-zavrsni.pdf · razvoja „depth-first backtracking algorithm“ (dubinsko unatražno

Embed Size (px)

Text of PROBLEM OSAM KRALJICA -...

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]);

}

}

}

}