Atestat Metoda Backtracking

48

Transcript of Atestat Metoda Backtracking

Page 1: Atestat Metoda Backtracking
Page 2: Atestat Metoda Backtracking

Cuprins

1.Introducere……………………………..pag.3

1.Metoda backtracking……………………pag.2

2.Rutina backtracking………….…….……pag.4

3.Programe si probleme…………..……….pag.5

4.Bibliografie……………….…….……….pag.7

1

Page 3: Atestat Metoda Backtracking

INFORMATICA

Academia Franceză definea informatica: „Ştiinţa tratării raţionale prin maşini automate a informaţiei, considerată ca suport al cunoştinţelor umane, precum şi a comunicărilor în domeniile tehnic, economic şi social”.

În sens mai larg, informatica se ocupă de organizarea, memorarea, prelucrarea, transmiterea şi redarea informaţiilor într-o formă accesibilă omului, şi de asemenea, de configurarea unui ansamblu de echipamente care asigură funcţiile de mai sus.

Introducerea informaticii în diverse domenii de activitate, constă în aplicarea unitară a metodelor, tehnicilor, terminologiilor specifice informaticii, este într-un cuvânt „informatizare” şi rezultă într-o activitate cu eficienţă mai mare.

Informatica s-a născut odată cu calculatorul; din acel moment informaţia a devenit un concept fundamental ştiinţific şi tehnologic aplicat unor fenomene, de la găurile negre din univers la DNA, de la organizarea celulelor la procesele gândirii umane, de la conducerea întreprinderilor la alocarea resurselor globale. Acest concept a restructurat disciplinele stabilite, a stimulat formarea unor noi subiecte şi domenii de activitate. Trăim acum într-o societate a informaţiei, un ev al informaţiei. Privim modele de prelucrare a informaţiei pentru a ne explica propriile noastre modele de gândire.

Teorii bazate pe conceptul de informaţie i-au permis acestuia să devină o caracteristică a timpului nostru. În toată această transformare calculatorul a jucat rolul central. Din 1957 încoace, calculatorul a înlocuit metodele tradiţionale de calcul şi evidenţă a datelor printr-o nouă industrie de prelucrare a datelor, devenind astfel nucleul tehnologiei moderne a informaţiei.

2

Page 4: Atestat Metoda Backtracking

Născută odată cu calculatorul electronic, informatica (Computer science, Informatique, Informatik) a evoluat încet până în anii '60, când a început să capete formă, reunind subiecte din logica matematică (automate, teoria demonstraţiei, teoria funcţiilor recursive), lingvistica matematică şi analiza numerică (algoritmi), adăugându-le probleme de organizare a informaţiilor(structuri de date) şi legătura între arhitectura calculatorului şi modele de prelucrare a informaţiei. Ea s-a dezvoltat pe măsură ce viteza şi puterea de calcul au crescut.

Denumirea de informatică vine de la franţuzescul „informatique” („information”–„informaţie” + „automatique”–„automat”).

MOMENTE DE REFERINŢĂ

Apariţia tranzistorului la 3 iunie 1948 când Walter Brattain, William Shockley şi metalurgiştii Scaff, Teurer şi Bardeen au făcut prima demonstraţie publică a primului tranzistor cu siliciu în 1954, a primului circuit integrat în 1961 (W.Shockley, Gordon Moore, Robert Noyce, James Buie) şi a primului microprocesor INTEL 4004 în iunie 1971, au fost tot atâtea momente de revoluţie tehnologică şi de accelerare pentru informatică. Un astfel de moment a fost şi apariţia ingineriei programării (software engineering), în anul 1967, ca termen atât de provocator. Limbajele de programare au jucat un rol extrem de important în dezvoltarea explozivă a informaticii.

În 1957 John Backus şi Irving Ziller de la IBM au creat limbajul FORTRAN (FORmula TRANslation), în 1959 apar limbajele ALGOL (ALGOrithmic Language) şi COBOL (Common Business Oriented Language), în 1962 APL, în 1964 BASIC (Beginners All Purpose Standard for Information

3

Page 5: Atestat Metoda Backtracking

Coding) creat de prof. John Kemeny şi Thomas Kurz de la Colegiul Dorthmounth, în 1967 PL1, în 1968 PASCAL, în 1972 PROLOG (PROgramming in LOGic), ADA, LISP (List Programming), fără a mai vorbi de diverse alte limbaje specializate. Tendinţa este crearea unor limbaje artificiale din ce în ce mai apropiate de limbajul natural.

Aşa a devenit calculatorul tot mai prietenos şi mai uşor de folosit pentru sarcini tot mai complexe; această cutie minunată ne ajută acum să vedem adevăruri pe care nu le intuisem, să vedem mai bine şi mai departe în necunoscut, să scăpăm de munca de rutină şi să eliberăm mintea pentru a gândi mai profund. El nu se substituie omului, este însa deja o unealtă indispensabilă, este esenţial pentru eliberarea omului de un fel de muncă, însoţindu-l însă, pentru că mintea astfel eliberată se va concentra către nivelul superior în căutarea adevărului.

În faţa unor probleme grele dintr-un anumit domeniu, omul va beneficia prin calculator de toată experienţa precedentă în domeniul respectiv, mintea sa având o sarcină dificilă: să facă, ajutată de maşină, acea legătură logică de care maşina nu este capabilă singură, deocamdată.

CALCULATORUL NUMERIC.PRINCIPII

În 1946 echipa condusă de Eckert şi Mauchly a construit primul calculator electronic din lume, ENIAC (Electronic Numerical Integrator and Computer),costul său de atunci fiind de 150.000$.Acesta a fost construit în special pentru calcule

4

Page 6: Atestat Metoda Backtracking

balistice. Numerele au fost primele informaţii prelucrate de calculatoare.

Dispozitivele electronice care intră astăzi în construcţia calculatoarelor numerice de astăzi au din punct de vedere electronic două stări posibile: conduc sau nu curentul electric; putem nota aceste stări cu 1 şi respectiv 0.Este o convenţie, pornită însă de la justificări tehnologice.

Starea notată acum cu 0 putea fi notată cu 1 şi invers, cea notată cu 1 putea fi notată cu 0.Din punct de vedere funcţional cele două notaţii sunt la fel de bune. Deci un astfel de dispozitiv are două stări echiprobabile posibile (2¹) şi este similar unui întrerupător simplu sau unui bec, care poate fi aprins sau stins. Dacă astfel de dispozitive asigură patru stări (2²) – două becuri pot fi amândouă aprinse, amândouă stinse, unul aprins şi celălalt stins, şi invers – trei dispozitive au 8 stări (2³), n dispozitive au 2 la puterea n stări posibile,2ⁿ.

REPREZENTAREA INFORMAŢIEI NUMERICE

Calculatorul operează cu numere în baza 2, pentru simplul motiv că, tehnologic, a fost convenabilă materializarea a două stări. Este comod să realizezi stările conectat (1), deconectat (0) cu un releu, sau saturat (0), blocat (1) cu un tranzistor.

O cifră binară se numeşte bit (b), o grupă de 4 biţi se numeşte nible iar o grupă de 8 biţi se numeşte octet sau byte.

1 byte = 1B = 8 bit1 kbit = 1 Kb = 2¹º bit = 1024 bit1 kbyte = 1 KB = 2¹º byte = 1024 byte1 Mbit = 1 Mb = 2²º bit = 1048576 bit1 Mbyte = 1MB = 2²º byte = 1048576 byte1GB = 1024 MB

5

Page 7: Atestat Metoda Backtracking

Un byte este informaţia transmisă de 8 biţi, pentru că celor 8 biţi le corespund combinaţii, iar 256 = 8 adică un byte.

Calculatorul, operând numai cu informaţie binară, înseamnă că indiferent de semnificaţie (numere, caractere alfa-numerice sau instrucţiuni), întreaga informaţie din calculatorul numeric este binară, 0 sau 1.

SCURT ISTORIC AL APARIŢIEI CALCULATOARELOR

După reprezentarea internă a informaţiei calculatoarele sunt:

- analogice, dacă semnalele interne sunt continue;- numerice, dacă semnalele interne sunt discrete;- hibride, dacă sunt ambele feluri de semnale interne.În ceea ce priveşte calculatorul numeric, folosirea maşinii a

început în Orientul mijlociu cu folosirea pietrelor.Babilonienii au dezvoltat ideea prin inventarea abacului

(dispozitiv de numărare cu bile; China Antică î.e.n.), instrument încă folosit şi extrem de eficient în calcule aritmetice.

În secolele VIII şi IX s-a dezvoltat sistemul de numeraţie arăbesc, care s-a răspândit şi în Europa. Acest sistem a solicitat dezvoltarea şi înţelegerea unei teorii complicate a numerelor.

Pe la 1600 Napier (care a avut contribuţii şi în dezvoltarea logaritmilor şi aplicaţiilor lor practice) a introdus o serie de beţişoare care puteau fi folosite pentru înmulţire. Aceasta este posibil să fi fost predecesorul riglei de calcul.

Între 1640-1675 au loc realizări ale lui Pascal, Decartes, Leibniz. Un exemplu de maşină mai complicată este Pascalina, inventată de Blaise Pascal.

6

Page 8: Atestat Metoda Backtracking

În 1791, Babbage, matematician englez, a dezvoltat împreună cu Ada Byron (fiica lordului Byron) ideile a două maşini de calculat mecanice.

Între 1801-1804, englezul Jaquard a construit o maşină de ţesut ce funcţiona cu ajutorul cartelelor perforate.

Prima, maşină de diferenţe era destinată rezolvării ecuaţiilor polinomiale prin metoda diferenţelor.

A doua, maşina analitică, era destinată ca maşină de calcul de uz general. Deşi nepuse în practică, din cauza limitărilor tehnologice de atunci, aceste proiecte au lansat concepte încă actuale.

Pe la 1880 Herman Hollerith, funcţionar la serviciul Census din Statele Unite a sugerat folosirea cartelelor perforate ca suport pentru a memora numere, şi un cititor de cartele care putea tabela rezultatele. El a făcut o firmă, aşa numita Tabulating Machine Company (transformată mai târziu în IBM). Al doilea război mondial a constituit impulsul realizării unor maşini performante. Sub conducerea lui Aitken, între 1937-1944, la Universitatea Harward, s-a construit Mark I, o maşină electromecanică, cu relee, construită de IBM pentru U.S. Navy.

Mai târziu, Colossus a fost construit de englezi în scopul decodificării transmisiilor radio germane.

ABC (Atanasoff-Berry Computer) a fost primul calculator cu adevărat electronic.

ENIAC, construit de o echipă condusă de Eckert, la Universitatea din Pennsylvania, a fost însă primul calculator electronic adevărat, în sensul că poseda şi memorie, aşa că schimbarea programelor nu mai însemna recablare, aşa cum se întâmplă la ABC. Urmează apoi EDVAC (Electronic Discret Variable Automatic Computer) construit de aceeaşi echipă între 1945-1949.

7

Page 9: Atestat Metoda Backtracking

În 1951 se construieşte primul calculator destinat scopurilor comerciale, UNIVAC.

Calculatoarele numerice pot fi de uz general sau specializate, în ultimul caz ele echipând sisteme care asigură numai o singură aplicaţie.

Suntem acum în plină desfăşurare a generaţiei a cincea de calculatoare. Pe scurt, succesiunea a fost următoarea:

- Generaţia I (1946-1956) – cu relee, logică prin excelenţă cablată, dar şituburi electronice, limbaje de asamblare.

- Generaţia II-a (1957-1963) – cu tuburi electronice, limbaje de nivel înalt (Fortran, Cobol).

- Generaţia III-a (1964-1981) – cu circuite integrate pe scară largă LSI (Large Scale Integration), memorii semiconductoare, limbaje de nivel foarte înalt (Pascal, Lips).

- Generaţia IV-a (1982-1992) – circuite integrate pe scară foarte largă VLSI (Very Large Scale Integration), limbaje orientate obiect (Lisp,C).

- Generaţia a V-a (1992-prezent) – circuite integrate pe scară ultralargă ULSI, programare funcţională, prelucrare simbolică, sisteme expert evoluate, limbaje concurente, limbaje naturale.

Într-un anumit sens, istoria calculatoarelor personale care formează acum clasa maşinilor cele mai răspândite, a început în 1974, când firma Intel a produs microprocesorul 8080, care conţinea 4.500 tranzistoare şi era capabil să adreseze 64 Kb de memorie, pe o magistrală de 16 bit. Acest microprocesor a echipat microcalculatorul MITS Altair care a polarizat de la început, din 1975, interesul public.

8

Page 10: Atestat Metoda Backtracking

În 1978 Intel a produs microprocesorul 8086 a cărui performanţă era de 10 ori mai mare.

Sistemul de operare era DOS versiunea 1.0 care putea lucra numai cu discuri magnetice cu o singură faţă activă (160 KB). Versiunea 1.1 a permis folosirea discurilor cu două feţe active, dublând astfel capacitatea (320 KB).

În august 1982 a fost introdusă placa grafică Hercules care a permis mărirea rezoluţiei grafice. Ca pachet de programe, LOTUS 123 (spreadsheet), a permis noului IBM PC cucerirea unei largi audienţe în rândul utilizatorilor.

În 1981 IBM a început proiectarea primului calculator personal serios, primul PC în accepţiunea modernă, folosind ca procesor 8088, strâns înrudit cu 8086 având un display color monocrom CGA. Prin concepţia sa modulară şi prin structura deschisă, noul produs a cucerit curând piaţa.

În noiembrie 1982, firma Compaq produce primul calculator portabil compatibil, prima copie (clone) IBM. Standardul IBM PC devine din ce în ce mai popular iar din ce în ce mai multe firme produc calculatoare copie.

Firma Phoenix technologies scoate programele BIOS şi SYS care funcţionează ca şi IBM BIOS fără a-l fi copiat. BIOS înseamnă (input and output system) şi este nucleul programelor (software) esenţiale pentru tastatura, disc magnetic şi monitor (display).

În martie 1983 IBM introduce calculatorul PC XT cu memorie mai multă, şi cu disc magnetic dur (hard drive).Apare versiunea DOS 2.0.

În1984 IBM introduce pe piaţă primul PC portabil. În august 1984 apare primul calculator IBM PC AT mai puternic, cu un nou procesor Intel 80826, un nou standard grafic (EGA) şi

9

Page 11: Atestat Metoda Backtracking

o nouă versiune DOS 3.0 care administrează o nouă generaţie de discuri magnetice flexibile (1.2 MB).

În1985 firma Microsoft scoate noul mediu grafic Windows. În acelaşi an apare DOS 3.2 care poate lucra şi cu dischete de 3,5 inch de capacitate 720KB.DOS poate adresa acum până la 32 MB pe un singur disc dur.

În septembrie 1986, Compaq produce un nou calculator cu procesorul 80386, mai puternic ca PC AT.

În aprilie 1987 apar modelele IBM PC/230, 50 şi 60, versiunea DOS 3.3, standardul video VGA.

1987.Microsoft Windows versiunea 2.01990. Microsoft introduce Windows versiunea 3.0, încă

actuală. Folosirea programelor este mai productivă având la dispoziţie ferestre grafice soft multiple şi posibilitatea de a comuta între mai multe sarcini soft active pe ecran. Dar Windows poate funcţiona acceptabil, numai pe maşini mai puternice, de exemplu ele conţinând microprocesorul 386 DX sau 386 SX.

În iunie 1991 apare DOS 5.0, incluzând caracteristici noi: interfaţă prietenoasă cu utilizatorul, editor inclus, opţiuni unformat/unerase, un interpretor Basic îmbunătăţit.

Au urmat apoi calculatoare din ce în ce mai performante, echipate cu procesoare 486 în diverse variante, apoi Pentium etc.

Calculatoare şi modem-uri legate prin tehnologia celulară radio/telefon fără fir permit fiecărui calculator să se conecteze oriunde în lume. Apoi a fost posibilă structurarea Internetului, marea magistrală informatică actuală.

10

Page 12: Atestat Metoda Backtracking

Metoda BACKTRACKINGLa dispoziţia celor care rezolvă probleme cu ajutorul calculatorului există mai multe metode . Dintre acestea cel mai des utilizate sunt:

- metoda Greedy;- metoda Divide et impera;- metoda Branch and Bound;- metoda Backtracking;

Metoda Backtracking se aplică problemelor în care soluţia poate fi reprezentată sub forma unui vector – x = (x1, x2, x3, …xk,… xn) € S, unde S este mulţimea soluţiilor problemei şi S = S1 x S2 x… x Sn, şi Si sunt mulţimi finite având s elemente si xi € si , (¥)i = 1..n.

Pentru fiecare problemă se dau relaţii între componentele vectorului x, care sunt numite condiţii interne; soluţiile posibile care satisfac condiţiile interne se numesc soluţii rezultat. Metoda de generare a tuturor soluţiilor posibile si apoi de determinare a soluţiilor rezultat prin verificarea îndeplinirii condiţiilor interne necesită foarte mult timp.

Metoda backtracking evită această generare şi este mai eficientă. Elementele vectorului x, primesc pe rând valori în ordinea crescătoare a indicilor, x[k] va primi o valoare numai daca au fost atribuite valori elementelor x1.. x[k-1]. La atribuirea valorii lui x[k] se verifica îndeplinirea unor condiţii de continuare referitoare la x1…x[k-1]. Daca aceste condiţii nu

11

Page 13: Atestat Metoda Backtracking

sunt îndeplinite, la pasul k, acest lucru înseamnă ca orice valori i-am atribui lui x[k+1], x[k+1], .. x[n] nu se va ajunge la o soluţie rezultat.

Metoda backtracking construieşte un vector soluţie în mod progresiv începând cu prima componentă a vectorului şi mergând spre ultima cu eventuale reveniri asupra atribuirilor anterioare.

Metoda se aplica astfel :1) se alege prima valoare sin S1 si I se atribuie lui x1 ;2) se presupun generate elementele x1…x[k-1], cu valori din

S1..S[k-1]; pentru generarea lui x[k] se alege primul element din S[k] disponibil si pentru valoarea aleasa se testează îndeplinirea condiţiilor de continuare.Pot apărea următoarele situaţii :

a) x[k] îndeplineşte condiţiile de continuare. Daca s-a ajuns la soluţia finală (k = n) atunci se afişează soluţia obţinută. Daca nu s-a ajuns la soluţia finală se trece la generarea elementului următor – x [k-1];

b) x[k] nu îndeplineşte condiţiile de continuare. Se încearcă următoarea valoare disponibila din S[k]. Daca nu se găseşte nici o valoare în S[k] care să îndeplinească condiţiile de continuare, se revine la elementul x[k-1] şi se reia algoritmul pentru o nouă valoare a acestuia. Algoritmul se încheie când au fost luate in considerare toate elementele lui S1.

Este o tehnica de programare aplicabila algoritmilor care oferă mai multe soluţii şi are ca rezultat obţinerea tuturor soluţiilor problemei. Fiecare soluţie se memorează într-o structura de date de tip stivă implementată cu

12

Page 14: Atestat Metoda Backtracking

ajutorul unui vector. Deci fiecare soluţie poate fi pusă sub forma unui vector.

Într-un algoritm backtracking ne interesează toate soluţiile posibile. Pentru a obţine fiecare soluţie finală se completează stiva nivel cu nivel trecând astfel prin nişte soluţii parţiale. Astfel soluţiile finale cât şi cele parţiale pentru a fi luate în considerare trebuie să îndeplinească anumite condiţii numite condiţii de validare. O soluţie care îndeplineşte o astfel de condiţie se numeşte soluţie validă.

Toate configuraţiile stivei ce reprezintă soluţii finale sunt alcătuite din elementele aceleiaşi mulţimi bine definite pe care o numim mulţimea soluţiilor. Fiecare nouă soluţie parţială se obţine prin completarea soluţiei parţiale precedente cu încă o nivel pe stivă. La fiecare nivel se pun valori din mulţimea soluţiilor care nu au fost încercate până când se obţine o soluţie validă. În acest moment se trece la nivelul următor în stivă pentru a completa mai departe soluţia reluând încercările pe noul nivel. La un moment dat pe un anumit nivel nu mai există nici o valoare neîncercată din mulţimea valorilor problemei. În acest caz se face un pas înapoi în stivă la nivelul anterior şi se reia căutarea cu valorile rămase neîncercate pe acest nivel anterior. Respectivul nivel a mai fost vizitat dar l-am abandonat după ce am pus o valoare care a generat o soluţie validă. Deci este posibil să fi rămas aici valori neîncercate. Dacă nici pe acest nivel nu mai avem valori neîncercate mai facem un pas înapoi în stivă. Mecanismul revenirilor a determinat denumirea de metoda backtracking.Plecând de la nivelul 1 şi repetând algoritmul până când pe toate nivelele au fost încercate toate valorile din mulţimea valorilor se obţin soluţii finale care se tipăresc.Vom implementa metoda backtracking iterativ folosind o rutină unică aplicabilă oricărei probleme. Rutina va apela proceduri şi funcţii care au întotdeauna acelaşi nume şi parametri şi care din punct de vedere al metodei realizează acelaşi lucru.

13

Page 15: Atestat Metoda Backtracking

Sarcina rezolvatorului este să scrie explicit - pentru fiecare problemă - procedurile şi funcţiile aplicate pe rutină. Astfel găsirea următorului element netestat de pe un nivel k al stivei St se face cu procedura succesor (as,St,k)

Odată ales un element testarea condiţiilor de validare se face cu procedura valid (ev,St,k).Testul dacă s-a ajuns sau nu la o soluţie finală se face cu funcţia soluţie (k) Soluţia se tipăreşte cu procedura tipar.De asemenea fiecare nivel al stivei trebuie iniţializat cu o valoare aflată înaintea tuturor valorilor posibile din mulţimea soluţiilor. Această afişare se face cu procedura init (k,St).

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+1; init(k,St); end;

14

Page 16: Atestat Metoda Backtracking

else k:=k-1; end;

end;

PROGRAME SI PROBLEME Turnuri de cuburi

Se dau n cuburi numerotate 1,2,...,n, de laturi Li si culori Ci, i=1,2,...,n (fiecare culoare este codificata printr-un caracter). Sa se afişeze toate turnurile care se pot forma luând k cuburi din cele n disponibile, astfel încât:

-laturile cuburilor din turn sa fie in ordine crescătoare; -culorile a oricare doua cuburi alăturate din turn sa fie diferite.

program cuburi;

15

Page 17: Atestat Metoda Backtracking

type stiva=array [1..100] of integer;var st:stiva; i,n,p,k:integer; as,ev:boolean; L:array [1..10] of integer; C:array [1..10] of char;procedure init(k:integer;var st:stiva);beginst[k]:=0;end;procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<n then begin st[k]:=st[k]+1; as:=true; end else as:=false;end;procedure valid(var ev:boolean;st:stiva;k:integer);var i:integer;beginev:=true;for i:=1 to k-1 do if L[st[k]]<=L[st[i]] then ev:=false;if C[st[k]]=C[st[k-1]] then ev:=false;end;function solutie(k:integer):boolean;beginsolutie:=(k=p);end;procedure tipar;var i:integer; beginfor i:=1 to p do write(st[i],' ');writeln;end;beginwrite('n= ');read(n);write('p= ');read(p);

16

Page 18: Atestat Metoda Backtracking

for i:=1 to n dobeginwrite('L[',i,']=');readln(L[i]);write('C[',i,']=');readln(C[i]);end;k:=1;init(k,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+1; init(k,st); end else k:=k-1; end; end.

Dintr-un nr. de 6 cursuri opţionale un elev trebuie să aleagă 3. Să se afişeze toate

posibilităţile de alegere precum şi nr. lor.

program cursuri;{iterativ}const n=6; p=3;type stiva=array [1..10] of integer;var st:stiva; ev,as:boolean; k:integer;procedure init(k:integer;var st:stiva);beginif k>1 then st[k]:=st[k-1] else if k=1 then st[k]:=0;end;

17

Page 19: Atestat Metoda Backtracking

procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<n-p+k then begin st[k]:=st[k]+1; as:=true; end else as:=false;end;procedure valid(var ev:boolean;var st:stiva;k:integer);var i:integer;beginev:=true;for i:=1 to k-1 do if st[i]=st[k] then ev:=false;end;function solutie(k:integer):boolean;beginsolutie:=(k=p);end;procedure tipar;var i:integer;beginfor i:=1 to p do write (st[i]);writeln;end;begin;k:=1;init(k,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+1; init(k,st) end else k:=k-1; end;

18

Page 20: Atestat Metoda Backtracking

readln;end.

Numerele care îi plac lui Irinel

Lui IRINEL îi plac nr. formate numai din cifre pare cifre aflate în ordin_______escătoare. Să se determine şi să se afişeze pe ecran toate nr. de n cifre (0<n<10) care îi plac lui Gigel. Valoarea lui n este un nr. natural care se citeşte de la tastatură.{ex.: n=3 200; 220; 222; 400; 402; 422; 440; 442; 444; 600; 620; 622; 640; 644; 660; 662; 664; 666; 800; 820; 822; 840; 842; 844; 860; 862; 864; 866; 880; 882; 884; 886; 888.}

program nr_lui_IRINEL; {iterativ}type stiva=array[1..100] of integer;var st:stiva;i,n,k:integer;as,ev:boolean;procedure init(k:integer;var st:stiva);beginst[k]:=-1;end;procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<9 then begin st[k]:=st[k]+1; as:=true; end else as:=false;end;procedure valid(var ev:boolean;st:stiva;k:integer);var i:integer;beginev:=true;for i:=1 to k-1 do if st[i] mod 2 <> 0 then ev:=false;for i:=1 to k-1 do if st[i]<st[i+1] then ev:=false;

19

Page 21: Atestat Metoda Backtracking

end;function solutie(k:integer):boolean;beginsolutie:=(k=n);end;procedure tipar;var i:integer;beginfor i:=1 to n do write(st[i]);writeln;end;beginwrite('n= ');readln(n);k:=1 ;init(k,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+1; init(k,st); end else k:=k-1; end; readln; end.

PROGRAM COMISV

program comisv;type stiva=array[1..100] of integer;var st:stiva; i,j,n,k:integer; as,ev:boolean; a:array[1..20,1..20] of integer;procedure init(k:integer;var st:stiva);

20

Page 22: Atestat Metoda Backtracking

beginst[k]:=1;end;

procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<n then begin st[k]:=st[k]+1; as:=true end else as:=falseend;procedure valid(var ev:boolean;st:stiva;k:integer);var i:integer;beginev:=true;if a[st[k-1],st[k]]=0 then ev:=falseelsefor i:=1 to k-1 do if st[i]=st[k] then ev:=false;if (k=n) and (a[1,st[k]]=0) then ev:=falseend;function solutie(k:integer):boolean;beginsolutie:=(k=n)end;procedure tipar;var i:integer;beginfor i:=1 to n do write('nodul=',st[i]);writeln('------');end;beginwrite('nr. de noduri=');readln(n);for i:= 1 to n dofor j:=1 to i-1 do beginwrite('a[',i,',',j,']='); readln(a[i,j]);

21

Page 23: Atestat Metoda Backtracking

a[j,i]:=a[j,i]; end;end;st[1]:=1; k:=2;init(k,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+1; init(k,st); end else k:=k-1; end;end.

PROGRAM DAME

program dame;{iterativ}type stiva=array[1..100] of integer;var st:stiva; n,k:integer; as,ev:boolean;procedure init(k:integer;var st:stiva);begin st[k]:=0;end;procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<n then begin st[k]:=st[k]+1; as:=true end else as:=false;end;

22

Page 24: Atestat Metoda Backtracking

procedure valid(var ev:boolean;var st:stiva;k:integer);var i:integer;begin ev:=true;for i:=1 to k-1 do if (st[k]=st[i]) or (abs(st[k]-st[i])=abs(k-i)) then ev:=false;end;function solutie(k:integer):boolean;beginsolutie:=(k=n);end;procedure tipar;var i:integer;beginfor i:=1 to n do write(st[i]);writeln;end;beginwrite('n:');readln(n);k:=1;init(k,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+1; init(k,st); end else k:=k-1; end; readln;end.

PROGRAM DESC 2

program desc2;

23

Page 25: Atestat Metoda Backtracking

type stiva=array[1..100] of integer; var st:stiva; s,n,k:integer; as,ev:boolean; procedure init(k:integer;var st:stiva); begin st[k]:=0; end; procedure succesor(var as:boolean;var st:stiva;k:integer); begin if st[k]<n then begin st[k]:=st[k]+1; as:=true; end else as:=false;end;procedure valid(var ev:boolean;st:stiva;k:integer);var i:integer;begins:=0;ev:=true;for i:=1 to k do s:=s+st[i];if s<=n then ev:=true else ev:=false;end;function solutie(k:integer):boolean;beginsolutie:=(s=n);end;procedure tipar;var i:integer;beginfor i:=1 to k do write(st[i]);writeln;end;beginwrite('n=');readln(n);while k>0 do begin repeat

24

Page 26: Atestat Metoda Backtracking

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+1; init(k,st); end else k:=k-1; end; end.

PROGRAM PARANTEZE

program paranteze;type stiva=array[1..100] of integer;var st:stiva; npd,npi,n,k:integer; as,ev:boolean;procedure init(k:integer;var st:stiva);beginst[k]:=0;end;procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<2 then begin st[k]:=st[k]+1; as:=true; end else as:=false;end;procedure valid(var ev:boolean;st:stiva;k:integer);var i:integer;beginnpd:=0;

25

Page 27: Atestat Metoda Backtracking

npi:=0;for i:=1 to k doif st[i]=1 then npd:=npd+1 else npi:=npi+1;if (npd>=npi) and (npd<=n div 2) then ev:=true else ev:=false;end;function solutie(k:integer):boolean;beginsolutie:=(k=n);end;procedure tipar;var i:integer;begin if npd=npi then for I:=1 to k doif st[i]=1 then write('(') else write(')');writeln;beginwrite('n= ');read(n);st[1]=1;k:=1;init(k,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+1; init(k,st) end else k:=k-1; end; readln;end.

26

Page 28: Atestat Metoda Backtracking

PROGRAM PARTITI ALE UNUI NUMAR

program partitii_ale_unui_nr; type stiva=array [1..10] of integer;var st:stiva; ev,as:boolean; n,k:integer;procedure init(k:integer;var st:stiva);begin st[k]:=0;end;procedure succesor(var as:boolean;var st:stiva;k:integer);begin if st[k]<n then begin st[k]:=st[k]+1; as:=true; end else as:=false;end;procedure valid(var ev:boolean;var st:stiva;k:integer);var i,s:integer;begin s:=0;for i:=1 to k dos:=s+st[i];if s<=n then ev:=true else ev:=false;end;function solutie(k:integer):boolean;beginsolutie:=(k=n);end;procedure tipar;var i:integer;beginfor i:=1 to n do write (st[i]);writeln;end;begin;write ('n:=');readln (n);k:=1;init(k,st);while k>0 do

27

Page 29: Atestat Metoda Backtracking

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+1; init(k,st) end else k:=k-1; end; readln;end.

PROGRAM PCARTEZ

program pcartez; type stiva=array[1..100] of integer; var st:stiva; i,n,k:integer; as,ev:boolean; a:array [1..100] of integer; procedure init(k:integer;var st:stiva); begin st[k]:=0; end; procedure succesor(var as:boolean;var st:stiva;k:integer); begin if st[k]<a[k] then begin st[k]:=st[k]+1; as:=true; end else as:=false; end; procedure valid(var ev:boolean;st:stiva;k:integer); var i:integer;

28

Page 30: Atestat Metoda Backtracking

begin ev:=true; end; function solutie(k:integer):boolean; begin solutie:=(k=n); end; procedure tipar; var i:integer; begin for i:=1 to n do write(st[i]); writeln; end; begin write('Numarul de multimi= ');readln(n); for i:=1 to n do beginwrite('a[',i,']=');readln(a[i]);end; k:=1;init(k,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+1; init(k,st); end else k:=k-1; end; end.

PROGRAM SIR

29

Page 31: Atestat Metoda Backtracking

program sir;type stiva=array[1..100] of integer;vector=array[1..100] of integer;var st:stiva; n,k,i:integer; as,ev:boolean; a:vector;procedure init(k:integer;var st:stiva);beginst[k]:=0;end;procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<n then begin st[k]:=st[k]+1; as:=true; end else as:=false;end;procedure valid(var ev:boolean;st:stiva;k:integer);var i:integer;beginev:=true;for i:=1 to k-1 do if st[k]=st[i] then ev:=false;if (a[st[k]]<0) and (a[st[k-1]]<0) then ev:=false;end;

function solutie(k:integer):boolean;beginsolutie:=(k=n);end;procedure tipar;var i:integer;beginfor i:=1 to n do write(a[st[i]],' ');writeln;end;beginwrite('n=');readln(n);

30

Page 32: Atestat Metoda Backtracking

for i:=1 to n do beginwrite('a[',i,']=');readln(a[i]);end;k:=1;init(k,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+1; init(k,st); end else k:=k-1; end; end.

PROGRAM SORTARE

{programul sortare contine si divide et impera}program sort;type vector=array[1..10] of integer;var a:vector; n,i:integer; procedure sort(p,q:integer;var a:vector); var m:integer; begin if a[p]>a[q] then begin m:=a[p]; a[p]:=a[q]; a[q]:=m end;

31

Page 33: Atestat Metoda Backtracking

end; procedure interc(p,q,m:integer;var a:vector); var b:vector; i,j,k:integer; begin i:=p; j:=m+1; k:=1; while (i<=m) and (j<=q) do if a[i]<=a[j] then begin b[k]:=a[i]; i:=i+1; k:=k+1 end else begin b[k]:=a[j];j:=j+1;k:=k+1 end; if i<=m then for j:=i to m do begin b[k]:=a[j]; k:=k+1; end elsefor i:=j to q do begin b[k]:=a[j]; k:=k+1; end;k:=1;for i:=p to q do begin a[i]:=b[k]; k:=k+1; endend;procedure divimp(p,q:integer; var a:vector);var m:integer;beginif (q-p)<=1 then sort(p,q,a) else begin m:=(p+q) div 2; divimp(p,m,a);

32

Page 34: Atestat Metoda Backtracking

divimp(m+1,q,a); interc(p.q.m.a); endend;write('n= ');read(n);for i:=1 to n dobeginwrite('a[',i,']=');readln(a[i]);end;divimp(1,n,a);for i:=1 to n do writeln(a[i]);end.{program turnuri hanoi}program p2;var a,b,c:char; n:integer;procedure hanoi(n:integer;a,b,c:char);beginif n=1 then writeln(a,b) else begin hanoi(n-1,a,c,b); writeln(a,b); hanoi(n-1,c,b,a); end;end;beginwrite('n=');readln(n);a:='a';b:='b';c:='c';hanoi(n,a,b,c);readln;end.

33

Page 35: Atestat Metoda Backtracking

Bibliografie

1.Tudor Sorin-Tehnici de programare

2.Cristian Udrea-Pascal Teorie si Aplicatii

34