Sunteți pe pagina 1din 14

Problema damelor

Problema celor opt dame, asezate pe o tabla de 8x8, cunoscuta la nivel mondial ca si The 8 Puzzle Queens, problema standard, consta in asezarea a opt dame pe table 8x8, care nu trebuie sa se atace intre ele. Pentru a gasi solutia corecta, nu trebuie sa existe doua dame pe aceasi linie, coloana, sau diagonala.

Istoric: Problema a fost prima data propusa in 1848 de catre jucatorul de sah Max Bezzel si peste cativa ani de mai multi matematiceni printre care si Johann Carl Friedrich Gauss care a lucrat la acesta problema si la problema generala. Prima solutie a fost gasita de Franz Nauck in 1850. Tot Nauck a generalizat problema. In 1874, S. Gunther a propus o metoda de gasire a solutilor folosind determinantul. Edsger Dijkstra a folosit aceasta problema in 1972 pentru a ilustra ceea ce noi numim structura de programare. El a publicat o descriere foarte detaliata a primului algoritm de backtracking. Aflarea solutiei: Problema pare destul de complicata, fiind 4.426.165.368 de cazuri posibile de a pune cele opt dame pe tabla de 8x8 si doar 92 de soluti corecte. Dintre cele 92 de solutii, exista doar 12 cazuri unice sau fundamentale. Caz 1

a b c d e f g h
X X X X

Caz 2.

8 a b c d e f g h X 7 X 8 6 X 7 X 5 X 6 4 X 5 X 3 X 4 2 X 3 X 1 X 2 X 1

Caz 3.

a b C d e f g h
X X X

Caz 4.

8 a b c d e f g h 7 X 8 X 6 X 7 5 X 6 X 4 X 5 X 3 X 4 X 2 X 3 1 X 2 X 1

Caz 5.

a b c d e f g h
X

8 X 7 X 6 5 X 4 X 3 X 2 1

Caz 6.

a b c d e f g h
X X X X X X X X X

8 7 X 6 5 X 4 3 X 2 1

Caz 7. Caz 8.

a b c d e f g h

8 X 7 a b c d e f g h 6 X 8 5 X 7 4 X 6 X 3 X 5 X 2 X 4 1 X 3 X 2 X 1

Caz 9.

a b c d e f g h
X

8 X 7 X 6 5 X 4 X 3 X 2 1

Caz 10.

a b c d e f g h
X X X X X X
Caz 11.

8 7 X 6 5 4 X 3 2 1

a b c d e f g h
X X

X X

8 X 7 a b c d e f g h 6 X 8 X 5 X 7 X 4 X 6 3 X 5 X 2 X 4 1 X 3 X 2 X 1

Caz 12.

1.Stiva: Stiva este o list pentru care singurele operaii permise sunt: adugarea unui element in stiv; eliminarea, consultarea sau modificarea unui element introdus in stiv;

Stiva funcioneaz pe principiul LIFO (Last In First Out) - ultimul intrat, primul ieit. Atenie: adugarea sau scoaterea unui element din stiv se face prin acelai capt, numit vrful stivei

Imaginai-v o stiv de farfurii de culori diferite.

1. Pentru a scoate farfuria roie trebuie s scoatem toate farfuriile aflate deasupra acesteia. 2. Acum putem extrage farfuria roie. 2. Exemplificarea lucrului cu stiva: 1. n stiva iniial vid se introduce elementul A i vrful stivei va fi nivelul 1 (k=1). 2. Introducem n stiv elementul B, deci vrful stivei va fi nivelul 2 (k=2). 3. Vrem s scoatem din stiv elementul A. Se procedeaz n felul urmtor: scoatem din stiv elementul B, deoarece A nu se poate scoate deocamdat. Vrful stivei devine nivelul 1 (k=1). 4.Scoatem din stiv pe A. 3.Tehnica backtracking: Exist clase de probleme pentru care algoritmii se proiecteaz dup o anumit metod de programare. Putem privi metoda de programare ca un ablon pe care l putem aplica pentru rezolvarea unor clase de probleme cu un specific comun.

Tehnica backtracking se folosete n rezolvarea problemelor care au urmtoarele caracteristici: - soluia lor poate fi pus sub forma unui vector: S= s1 s2 .... sn unde s1S1, s2S2.... snSn - mulimile S1, S2... Sn sunt mulimi finite, iar elementele lor se afl intr-o relaie de ordine bine stabilit. - nu avem la dispoziie o alt metod mai rapid. Important: - nu n toate problemele n este cunoscut de la nceput; - S1,S2,....Sn, pot fi la rndul lor vectori; - n multe probleme, S1,S2,...Sn coincid; - tehnica backtracking are ca rezultat obinerea tuturor soluiilor problemei. De aceea dac se dorete o singur soluie, trebuie forat oprirea algoritmului. Am artat c soluiile se genereaz sub form de vector. Considerm c acest vector este prelucrat ca o stiv. Notm vectorul stiv cu st i n este dimensiunea acesteia. Vectorul st format din elementele (st[1], st[2],..., st[n]) aparinnd S1 x S2 x ... x Sn se numete soluie final. Mulimea finit S = S1 x S2 x ... x Sn se numete mulimea soluiilor posibile. ntre elementele vectorului stiv st exista anumite relaii. Aceste relaii le vom numi condiii de validare. Vom spune despre st[1], st[2],..., st[k] c reprezint o soluie valid dac i numai dac sunt ndeplinite condiiile de validare ale problemei. O soluie valid devine soluie final dac numrul k al nivelului n stiv este egal cu n (dimensiunea stivei).

4. Exemplu practic: aranjarea mobilei ntr-o cas: Un exemplu practic de utilizare a unui algoritm backtracking l constituie problema aezrii mobilei ntr-o cas nou.

Exist multe posibiliti de ncercare dar n mod practic doar cteva vor fi luate n considerare. Pornind de la punctul iniial cnd casa este goal, fiecare pies de mobil este plasat n anumite locuri.

Dac toat mobila este aranjat i proprietarul este mulumit atunci algoritmul se ncheie. Dac ne vom lovi de situaia n care la un moment aranjamentul parial obinut este neplcut, suntem nevoii s renunm la poziia pe care am plasat ultima pies i s ncercm o alt amplasare a ei. Dac nu vom gsi o variant satisfctoare, continum s renunm i la poziia penultimei piese aezate, cutndu-i o alt poziie i aa mai departe. n situaia n care am renunat la toate variantele atunci nu exist nici un aranjament convenabil, deci problema nu are soluii.

n caz contrar, o s obinem soluia problemei. Trebuie menionat c algoritmul nu genereaz toate variantele posibile de aranjamente. Plasarea unei piese nu va fi fcut direct n toate locurile disponibile din cas. De exemplu, varianta de a aeza biblioteca n buctrie nu va fi luat n considerare. Multe asemenea variante vor fi abandonate din start deoarece conduc la obinerea unor aranjamente neplcute. 5. Metoda backtracking va folosi o serie de proceduri i funcii care vor fi folosite totdeauna cu acelai nume i aceiai parametri: procedure init(k, st); Rol: atribuie elementului situat pe nivelul k o valoare iniial Parametri: k - nivelul in stiv st - stiv procedure succesor(k, st, as); Rol: atribuie elementului st[k] din stiv valoarea urmtoare din mulimea Sk Parametri:

as - variabil boolean care ntoarce valoarea adevrat dac elementul situat pe nivelul k are succesor st - stiv k - nivelul in stiv procedure validare(k, st, ev); Rol: verific dac elementul pus pe nivelul k n stiv ndeplinete restriciile ntre elementele distinctive Parametri: k - nivelul in stiv st - stiv ev - variabil boolean care ntoarce valoarea adevrat dac elementul situat pe nivelul k este valid sau nu function solutie(k): boolean; Rol: verific dac s-au determinat toate elementele din stiv ce constituie vectorul soluie al problemei Parametri: k - nivelul in stiv procedure tipar; Rol: listeaz soluia determinat

6. Generarea permutrilor Un creator de mod a pregtit trei melodii pentru a crea ambientul muzical n timpul prezentrii ultimei sale colecii, dar nc nu s-a hotrt exact n ce ordine s le pun. El te roag s-i generezi toate succedrile posibile, astfel ncat s o poat asculta pe fiecare i s-o aleag pe cea mai potrivit. Observaie: - prima melodie o notm cu 1; - a doua melodie o notm cu 2; - a treia melodie o notm cu 3; - o succedare este valid cnd melodiile ce o compun sunt diferite ntre ele. k<-1 init(k,st) while k<0 do { repeat { succesor (k,st,as) if as then validare ( k,st,ev) until (not as) or (as and ev)

} if as then { if solutie(k) then tipar { else k<-k+1 init(k,st) } else k<-k-1 } } 7. Problema generrii aranjamentelor: n continuare v propunem urmtorul joc: folosindu-v de algoritmul prezentat anterior n problema creatorului de mod, suntei invitai s generai aranjamentele de trei elemente luate cte dou. Tot ce trebuie s facei e s umplei nivelul n stiv cu elementul corespunztor. Elementele le "luai" din mulimea din partea dreapt a ecranului i le "lsai" n nivelul corespunztor din stiv. n partea de jos a ecranului avei punctajul obinut. Observaie: elementul 0 este folosit pentru iniializarea nivelului k din stiv. 8. Problema damelor la general: S se gseasc toate modalitaile de a aranja n dame pe o tabl de ah de dimensiuni n x n, astfel nct ele s nu se atace una pe alta. Dou dame se atac dac ele se afl pe aceeai linie, pe aceeai coloana sau pe aceeai diagonala. Aceat problema fuctioneaza doar pentru n=1 sau n>=4. De exemplu, daca n=4, o solutie este reprezentata in figuria a.modul de obtinere al solutiei este prezent in figurile urmatoare, de la b la i. a)

x x x x
b)

c)

x x

d)

x x

e)

x x x

f)

g)

h)

x x x

i)

x x x x
Comentarii referitoare la figurile anterioare. b) Observam ca dama trebuie sa fie plasata singura pe linie. Prozitionam prima dama pe linia 1,coloana1. c) A doua dama nu poate fi asezata decat in coloana 3. d) Observam ca a treia dama nu poate fi plasata in linia 3.Incercam atunci plasarea celei de-a doua dame in coloana 4. e) A treia dama nu poate fi plasata decat in coloana 2. f) In aceasta situatie dama a patra nu mai poate fi asezata. Incercand sa avansam cu dama a treia , observam ca nu este posibil sa plasam nici in coloana a-3-a, nici in coloana a4-a, deci o vom scoate de pe tabla. Dama a doua nu mai poate avansa, deci si ea este scoasa de pe tabla .Avansam cu prima dama in coloana a-2-a. g) A doua dama nu poate fi asezata decat in coloana a-4-a. h) Dama a treia se aseaza in prima coloana. i) Acum este posibil sa plasam a patra data in coloana 3 si astfel am obtinut o solutie a problemei. Algoritmul continua in acest mod pana cand trebuie scoasa de pe tabla prima dama. Pentru cautarea si reprezentarea unei solutii folosim un vector cu n componente,numit sol.Prin sol[i] intelegem coloana in care se gaseste dama de pe linia i. Solutia cu ajutorul vectorului sol.

Doua dame se gasesc pe aceeasi diagiagonala daca si numai daca este indeplinita conditia: | sol(i)-sol(j) | =| i-j |

x x

sol(1)=1 i=1 sol(3)=3 j=3 | sol(1)-sol(3) | =| 1-3 | 2=2

x x

sol(1)=3 i=1 sol(3)=1 j=3 | sol(1)-sol(3) | =| 1-3 | 2=2

Intrucat doua dame nu se pot gasi in aceeasi coloana, rezulta ca o solutie este sub forma de premutare. O prima idee ne conduce la generarea tuturor permutarilor si la extragerea solutilor pentru problema. Daca procedam astfel , inseamna ca nu lucram conform strategiei backtracking. Acesta ca inediat ce gasim doua dame care se ataca , sa reluam cautarea in alte conditii. Fata de programul de n dame are o singura conditie suplimentara, in suprogramul valid. Int valid(int k) { for(int i=1;i<k;i++) if(sol[k]==sol[i]) return 0; return 1; } Problema este un exemplu folosit in mai toate lucrarile in care este prezentata metoda backtracking. Numar dame Solutii unice 1 1 2 0 3 0 4 1 5 2 6 1 7 6 8 12 9 46 10 92 11 341 12 1.787

Total solutii 13 9.233 73.712

10

40

92

352

724

2.680

14.200

14 45.752 365.596

24 28.439.272.956.934 227.514.171.973.736

25 275.986.683.743.434 2.207.893.435.808.352

26 2.789.712.466.510.289 22.317.699.616.364.044

Bibliografie
Manualul de informatica, cls. aXIa http://info.mcip.ro/?t=back http://www.scribd.com/doc/8066145/Metoda-Backtracking http://www.scritube.com/stiinta/informatica/Metode-deprogramare3424121010.php