Vous êtes sur la page 1sur 28

MINISTERUL EDUCAIEI,CERCETRII,TINERETULUI I SPORTULUI

COLEGIUL TEHNIC MTSARI

ATESTAT PROFESIONAL

Prof. ndrumtor
Sceanu Ion
Elev:
Popescu Florin Cristian
Profil: Matematic-Informatic
Colegiul Tehnic Mtsari
Clasa a XII-a B

MINISTERUL EDUCAIEI,CERCETRII,TINERETULUI I SPORTULUI


COLEGIUL TEHNIC MTSARI

PROBLEMA CELOR N
DAME

Prof. ndrumtor:
Sceanu Ion
Elev:
Popescu Florin Cristian
Profil: Matematic-Informatic
Colegiul Tehnic Mtsari
Clasa a XII-a B

CUPRINS

Argumentarea temei alese4


Problema celor n dame ....... 5
Prezentarea tehnicii Backtracking..6
Aplicaie problema celor 8 dame....................................................................................13
Aflarea soluiei:.................................................................................................................13
1.Stiva:...............................................................................................................................15
2. Exemplificarea lucrului cu stiva:...................................................................................16
3.Tehnica backtracking:.....................................................................................................16
4. Exemplu practic: aranjarea mobilei ntr-o cas:..........................................................18
5. Metoda backtracking.....................................................................................................19
6. Generarea permutrilor.................................................................................................20
7. Problema generrii aranjamentelor:.............................................................................21
8. Problema damelor la general:.......................................................................................22
Bibliografie...27

Argumentarea temei alese

Crearea unui soft educational este o art care seamn cu rezolvarea unui
puzzle. n activitatea sa omul lucreaz cu informaia. Metodele i tehnicile de organizare
a informaiei au evoluat mpreun cu dezvoltarea echipamentelor de calcul i cu evoluia
tehnicilor i limbajelor de programare.
nvtmntul modern presupune utilizarea unor mijloace de prezentare a
informaiei ntr-o form dinamic i care sa simuleze realitatea. Se tie c fiina uman
inva mai uor prin joc. Acest proiect ajut elevii s invee mai usor tehnica
backtracking prin prezentarea unei interfee n cazul problemei damelor.
Softul educaional reflect necesitatea cunoaterii limbajelor de programare in
scopul punerii n valoare a disciplinei <INFORMATICA>.
n acest scop mi-am ales tema Tehnica Backtraking aplicat la problema
damelor care descrie n mod grafic importana si necesitatea tehnicii Backtraking n
diverse aplicaii.

Problema celor n dame


METODA BACKTRACKING

Stiva este acea form de organizare a datelor (structur de date) cu


proprietatea c operaiile de introducere i scoatere a datelor se fac n
vrful ei.
Stivele se pot simula utiliznd vectori.
Fie ST(i) un vector. ST(1), ST(2), ..., ST(n) pot reine numai litere sau
numai cifre. O variabil K indic n permanent vrful stivei.
Exemplificm, n continuare, modul de lucru cu stiva:
A

n stiva iniial vid se introduce litera A, vrful stivei va fi la nivelul 1 (k-1);

B
A

introducem n stiv litera B, deci k va lua valoarea 2;

scoatem din stiv pe B (A nu poate fi scos);


scoatem din stiv pe A; stiva rmne vid

n mod practic la scoaterea unei variabile din stiv, scade cu 1 valoarea


variabilei ce indic vrful stivei, iar atunci cnd scriem ceva n stiv, o
eventual valoare rezidual se pierde:
Pe un anumit nivel se retine, de regul, o singur informaie (liter sau
cifr), ns este posibil; aa cum va rezulta din exemplele, prezentate n
lucrare, s avem mai multe informaii, caz n care avem de a face cu stive
duble, triple, etc.
ntreaga teorie a recursivitii se bazeaz pe structura de tip stiv.

Prezentarea tehnicii Backtracking


Aceast tehnic se folosete n rezolvarea problemelor care ndeplinesc
simultan urmtoarele condiii:
- soluia lor poate fi pus sub forma unui vector S=x 1,x2, ...,xn, cu x1
A1,
x2 A2 ,xn An
- mulimile A1, A2 , ., An sunt mulimi finite, iar elementele lor se
consider c se afl ntr-o relaie de ordine bine stabilit;
- nu se dispune de o alt metod de rezolvare, mai rapid
- x1 x2 , xn pot fi la rndul lor vectori;
- A1, A2 , An pot coincide.
La ntlnirea unei astfel de probleme, dac nu cunoatem aceast
tehnic, suntem tentai s generm toate elementele produsului cartezian
A1,A2 ,An si fiecare element s fie testat dac este soluie. Rezolvnd
problema n acest mod, timpul de execuie este att de mare, nct poate fi
considerat infinit, algoritmul neavnd nici o valoare practic.
De exemplu, dac dorim s generm toate permutrile unei mulimi
finite A, nu are rost s generm produsul cartezian AxAx.....xA, pentru ca
apoi, s testm, pentru fiecare element al acestuia, dac este sau nu
permutare (nu are rost s generm 1.1,1.......1, pentru ca apoi s constatm c
nu am obinut o permutare, cnd de la a doua cifr 1 ne puteam da seama c
cifrele nu sunt distincte).
Tehnica Backtracking are la baz un principiu extrem de simplu:
- se construiete soluia pas cu pas: x1, x2 ,xn
- dac se constat c, pentru o valoare aleas, nu avem cum s ajungem
la soluie, se renun la acea valoare i se reia cutarea din punctul n care
am rmas.
Concret:
- se alege primul element x, ce aparine lui A;
- presupunnd generate elementele x1,x2 ,xk , aparinnd mulimilor
A1,
A2 ,Ak , se alege (dac exist) xk+1 , primul element disponibil din
mulimea Ak+1 , apar dou posibiliti :
1) Nu s-a gsit un astfel de element, caz n care caz n care se reia
cutarea considernd generate elementele x1,x2 ,xk+1 , iar aceasta se reia
de la urmtorul element al mulimii Ak rmas netestat;
6

2) A fost gsit, caz n care se testeaz dac acesta ndeplinete anumite


condiii de continuare aprnd astfel dou posibiliti:
- ndeplinete, caz n care se testeaz dac s-a ajuns la soluie si apar
din nou dou posibiliti
- s-a ajuns la soluie, se tiprete soluia si se reia algoritmul
considernd generate elementele x1,x2 ,xk , (se caut n continuare, un alt
element al mulimii Ak , rmas netestat);
- nu s-a ajuns la soluie, caz n care se reia algoritmul considernd
generate elementele x1,x2 ,xk , si se caut un prim element xk+2 Ak.
- nu le ndeplinete caz n care se reia algoritmul considernd generate
elementele x1,x2 ,xk , iar elementul xk-1 se caut ntre elementele mulimii
A, rmase netestate.
Algoritmii se termin atunci cnd nu exist nici un element x 1 A1
netestat.
Observaie: tehnica Backtracking are ca rezultat obinerea tuturor
soluiilor problemei. n cazul n care se cere o sigur soluie se poate fora
oprirea, atunci cnd a fost gsit.
Am artat c orice soluie se genereaz sub form de vector. Vom
considera c generarea soluiilor se face intr-o stiv. Astfel, x 1 A1, se va
gsi pe primul nivel al stivei, x 2 A2 se va gsi pe al doilea nivel al stivei,...
xk Ak se va gsi pe nivelul k al stivei. n acest fel, stiva (notat ST) va arta
astfel:
...
xk

x2
x1
ST

Nivelul k+1 al stivei trebuie iniializat (pentru a alege, n ordine,


elementele mulimii k+1 ). Iniializarea trebuie fcut cu o valoare aflat (n
relaia de ordine considerat, pentru mulimea Ak+1 ) naintea tuturor valorilor
posibile din mulime. De exemplu, pentru generarea permutrilor mulimii
{1,2.....n}, orice nivel al stivei va lua valori de la 1 la n. Iniializarea unui
nivel (oarecare) se face cu valoarea 0. Procedura de iniializare o vom numi
7

INIT i va avea doi parametri: k (nivelul care trebuie iniializat si ST


(stiva)).
Gsirea urmtorului element al mulimii Ak (element care a fost
netestat) se face cu ajutorul procedurii SUCCESOR (AS,ST,K). Parametrul
AS (am succesor) este o variabil boolean. n situaia n care am gsit
elementul, acesta este pus n stiv i AS ia valoarea TRUE, contrar (nu a
rmas un element netestat) AS ia valoarea FALSE..
Odat ales un element, trebuie vzut dac acesta ndeplinete condiiile
de continuare (altfel spus, dac elementul este valid). Acest test se face cu
ajutorul procedurii VALID (EV,ST,K).
Testul dac s-a ajuns sau nu la soluia final se face cu ajutorul funciei
SOLUTIE(k) iar o soluie se tiprete cu ajutorul procedurii TIPAR.
Prezentm n continuare rutina Backtracking:
k:=1; init(1,st);
while k>0 do begin
repeat succesor (as, st, k) ; .
if as then valid(ev,st,k)
until (not as) or (as and ev) ;
if as then
if solutie(k) then tipar
else begin
k:=k+l;
init ( k, st );
end;
else k:=k-1
end;
Observaie: Problemele rezolvate prin aceast metod necesit un
timp ndelungat. Din acest motiv, este bine s utilizm metoda numai atunci
cnd nu avem la dispoziie un alt algoritm mai eficient. Cu toate c exist
probleme pentru care nu se pot elabora ali algoritmi mai eficieni, tehnica
backtracking trebuie aplicat numai n ultim instan.
Fiind dat o tabl de ah, de dimensiune n, x n, se cer toate soluiile de
aranjare a n dame, astfel nct s nu se afle dou dame pe aceeai linie,
coloan sau diagonal (dame s nu se atace reciproc).
Exemplu: Presupunnd c dispunem de o tabl de dimensiune 4x4, o
soluie ar fi urmtoarea:
D
D
D
8
D

Observm c o dam trebuie s fie plasat singur pe linie. Plasm


prima dam pe linia 1, coloana 1.
D

A doua dam nu poate fi aezat dect n coloana 3.


D
D

Observm c a treia dam nu poate fi plasat n linia 3. ncercm atunci


plasarea celei de-a doua dame n coloana 4.
D
D

A treia dam nu poate fi plasat dect n coloana 2.


D
D
D

n aceast situaie dama a patra nu mai poate fi aezat.


9

ncercnd s avansm cu dama a treia, observm c nu este posibil s o


plasm nici n coloana 3, nici n coloana 4, deci o vom scoate de pe tabl.
Dama a doua nu mai poate avansa, deci i ea este scoas de pe tabl.
Avansm cu prima dam n coloana 2.
D

A doua dam nu poate

fi aezat dect n coloana 4.


D
D

Dama a treia se aeaz n prima coloan.


D
D
D

Acum este posibil s plasm a patra dam n coloana 3 si astfel am


obinut o soluie a problemei.
D
D
D
D
Algoritmul continu n acest mod pn cnd trebuie scoas de pe tabl
prima dam.
Pentru reprezentarea unei soluii putem folosi un vector cu n
componente (avnd n vedere c pe fiecare linie se gsete o singur dam).

10

Exemplu pentru soluia gsit avem vectorul ST ce poate fi asimilat


unei stive.
Dou dame se gsesc pe aceeai diagonal dac si numai dac este
ndeplinit condiia: |st(i)-st(j)|=|i-j| ( diferena, n modul, ntre linii si
coloane este aceeai).
ST(4)
3
1
ST(3) n general ST(i)=k semnific faptul c pe linia i dama ocup
4
poziia k.
ST(2)
2
ST(1)
Exemplu: n tabla 4 x4 avem situaia:
st(1)= 1 i = 1
D
st(3)= 3 j = 3
D
|st(1) - st(3)| = |1 3| = 2
D
|i j| = |1 3| = 2
D
sau situaia
D
D
D
D

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

ntruct doua dame nu se pot gsi n aceeai coloan, rezult c o


soluie este sub form de permutare. O prim idee ne conduce la generarea
tuturor permutrilor si la extragerea soluiilor pentru problema ca dou dame
s nu fie plasate n aceeai diagonal. A proceda astfel, nseamn c lucrm
conform strategiei backtracking. Aceasta presupune ca imediat ce am gsit
dou dame care se atac, s relum cutarea.
lat algoritmul, conform strategiei generate de backtracking:
- n prima poziie a stivei se ncarc valoarea 1, cu semnificaia c n
linia unu se aeaz prima dam n coloan.
- Linia 2 se ncearc aezarea damei n coloana 1, acest lucru nefiind
posibil ntruct avem doua dame pe aceeai coloan.

11

- n linia 2 se ncearc aezarea damei n coloana 2 , ns acest lucru nu


este posibil, pentru c damele se gsesc pe aceiai diagonal (|st(1)-st(2)|=|12|);
- Aezarea damei 2 n coloana 3 este posibil.
- Nu se poate plasa dama 3 n coloana 1, ntruct n liniile 1-3 damele
ocupa acelai coloan.
- i aceast ncercare eueaz ntruct damele de pe 2 i 3 sunt pe
aceeai diagonal.
- Damele de pe 2-3 se gsesc pe aceeai coloan.
- Damele de pe 2-3 se gsesc pe aceeai diagonal.
- Am cobort n stiv mutnd dama de pe linia 2 i coloana 3 n coloana
4.
Algoritmul se ncheie atunci cnd stiva este vid. Semnificaia
procedurilor utilizate este urmtoarea:
INIT - nivelul k al stivei este iniializat cu 0;
SUCCESOR - mrete cu 1 valoarea aflat pe nivelul k al stivei n
situaia n care aceasta este mai mic dect n i atribuie variabilei EV
valoarea TRUE, n caz contrar, atribuie variabilei EV valoarea FALSE;
VALID - valideaz valoarea pus pe nivelul k al stivei, verificnd dac
nu avem dou dame pe aceeai linie (st(k)=st(i)), sau dac nu avem dou
dame pe aceeai diagonal (st(k)-st(i)=|k-i|)caz n care variabilei EV i se
atribuie FALSE; n caz contrar, variabilei EV i se atribuie TRUE;
SOLUTIE - verific dac stiva a fost completat pn la nivelul n
inclusiv;
TIPAR - tiprete o soluie.

12

Aplicaie,problema celor opt dame


Problema celor opt dame, aezate pe o tabl de 8x8, cunoscut la nivel mondial ca
i The 8 Puzzle Queens, problema standard, consta n aezarea a opt dame pe table 8x8,
care nu trebuie s se atace ntre ele. Pentru a gsii soluia corect, nu trebuie s existe
dou dame pe aceasi linie, coloan, sau diagonal.

Istoric:
Problema a fost prima dat propus n 1848 de ctre juctorul de ah Max Bezzel
i peste civa ani de mai muli matematiceni printre care i Johann Carl Friedrich
Gauss care a lucrat la acesta problem i la problem general. Prima soluie a fost
gsit de Franz Nauck n 1850. Tot Nauck a generalizat problema. n 1874, S. Gunther a
propus o metod de gsire a solutilor folosind determinantul.
Edsger Dijkstra a folosit aceast problem n 1972 pentru a ilustra ceea ce noi
numim structura de programare. El a publicat o descriere foarte detaliat a primului
algoritm de backtracking.

Aflarea soluiei:
Problema pare destul de complicat, fiind 4.426.165.368 de cazuri posibile de a
pune cele opt dame pe tabla de 8x8 i doar 92 de soluti corecte. Dintre cele 92 de soluii,
exist doar 12 cazuri unice sau fundamentale.
Caz 1
Caz 2.

a b c d e f g h
X

8
X

a b c d e f g h
X

7
X

7
X

X 5
X

6
X

4
X

4
X 3

2
X

13

1
X

2
1

Caz 3.
Caz 4.

a b C d e f g h

8 a b c d e f g h

X
X

7
X

8
X

7
X 6

5
X

4
X 3

1
X

Caz 5.

a b c d e f g h
3
X

X 6

5
X

a b c d e f g h
X

7
X 6
X

X
Caz 6.

5
X

4
3

X
X

2
1

14

3
2
1

Caz 7.
Caz 8.

a b c d e f g h

8 a b c d e f g h

X
X

7
6 X

X
X

7
X

5
X

6
X 5

4
X

X 3
X
X

a3 b c d e f g h

1
X

Caz 9.

8
X

5
X 4
X

3
X

X
Caz 10.
15

2
1

a b c d e f g h
X

7
X

6
5

4
X 3
X

Caz 11.
Caz 12.

a b c d e f g h

8a b c d e f g h

X
X

7
6

X 5

4X

X
X

3
X

2 X

1.Stiva:
X
Stiva este o list pentru
X
1
care
singurele
operaii
X
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
16

8
7
X

6
5
X 4

3
2
1

Imaginai-v o stiv de farfurii


de culori diferite.
I.

II.

Pentru a scoate farfuria roie


trebuie s scoatem toate
farfuriile
aflate
deasupra
acesteia.
Acum putem extrage farfuria
roie.

2. Exemplificarea lucrului
cu stiva:
a) n stiva iniial vid se introduce elementul A i vrful stivei va fi
nivelul 1 (k=1).
b) Introducem n stiv elementul B, deci vrful stivei va fi nivelul 2
(k=2).
c) 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).
d) 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
17

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).

18

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.

19

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:
20

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
{
21

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
22

atac dac ele se afl pe aceeai linie, pe aceeai coloana sau pe aceeai
diagonala. Aceast problem fuctioneaza doar pentru n=1 sau n>=4.
De exemplu, daca n=4, o soluie este reprezentat n figuria a. modul
de obinere al soluiei este prezent n figurile urmtoare, de la b la i.
a)

x
x
x
x
b)

c)

d)

x
x

e)

x
x
23

f)

g)

x
x

h)

x
x
x

i)

x
x
x
x
Comentarii referitoare la figurile anterioare.

Observm c dam trebuie s fie plasat singura pe linie. Prozitionam


prima dam pe linia 1,coloana1.
24

a) A doua dam nu poate fi aezat dect n coloana 3.


b) Observm c a treia dam nu poate fi plasat n linia 3.ncercam
atunci plasarea celei de-a dou dame n coloana 4.
c) A treia dam nu poate fi plasat dect n coloana 2.
d) n aceast situaie dam a patra nu mai poate fi aezat. ncercnd s
avansm cu dam a treia , observm c nu este posibil s plasm nici
n coloan a-3-a, nici n coloan a-4-a, deci o vom scoate de pe tabl.
Dam a doua nu mai poate avansa, deci i ea este scoas de pe
tabl .Avansm cu prima dam n coloan a-2-a.
e) A doua dam nu poate fi aezat dect n coloan a-4-a.
f) Dam a treia se aeaz n prima coloan.
g) Acum este posibil s plasm a patra dat n coloana 3 i astfel am
obinut o soluie a problemei.
Algoritmul continua n acest mod pn cnd trebuie scoas de pe tabla
prima dam.
Pentru cutarea i reprezentarea unei soluii folosim un vector cu n
componente,numit sol.Prin sol[i] nelegem coloana n care se gsete dam
de pe linia i.
Soluia cu ajutorul vectorului sol.
2

Dou dame se gsesc pe aceeasi diagiagonala dac i numai dac este


indeplinita conditia:
| sol(i)-sol(j) | =| i-j |

x
x

x
x

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

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

2=2

ntruct dou dame nu se pot gsi n aceeai coloan, rezult c o


soluie este sub form de premutare. O prim idee ne conduce la generarea
tuturor permutrilor i la extragerea solutilor pentru problema. Dac
procedm astfel , nseamn c nu lucrm conform strategiei backtracking.
Acesta ca inediat ce gsim dou dame care se ataca , s relum cutarea n
alte condiii.
Fa de programul de n dame are o singur condiie suplimentar, n
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 n mai toate lucrrile n care este
prezentat metoda backtracking.
Numar
dame

10

11

12

Solutii
unice

12

46

92

341

1.787

Total
solutii

10

40

92

352

724

2.680

14.200

13

14

24

25

26

9.233

45.752

28.439.272.956.934

275.986.683.743.434

2.789.712.466.510.289

73.712

365.596

227.514.171.973.73
6

2.207.893.435.808.35
2

22.317.699.616.364.04
4

26

27

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

28

Vous aimerez peut-être aussi