Sunteți pe pagina 1din 22

Cuprins 1.Introducere..pag.3 1.Metoda backtrackingpag.2 2.Rutina backtracking..pag.4 3.Programe si probleme...pag.5 4.Bibliografie...pag.

INFORMATICA Academia Francez definea informatica: tiina tratrii raionale prin maini automate a informaiei, considerat ca suport al cunotinelor umane, precum i a comunicrilor n domeniile tehnic, economic i social. n sens mai larg, informatica se ocup de organizarea, memorarea, prelucrarea, transmiterea i redarea informaiilor ntr-o form accesibil omului, i de asemenea, de configurarea unui ansamblu de echipamente care asigur funciile de mai sus. Introducerea informaticii n diverse domenii de activitate, const n aplicarea unitar a metodelor, tehnicilor, terminologiilor specifice informaticii, este ntr-un cuvnt informatizare i rezult ntr-o activitate cu eficien mai mare. Informatica s-a nscut odat cu calculatorul; din acel moment informaia a devenit un concept fundamental tiinific i tehnologic aplicat unor fenomene, de la gurile negre din univers la DNA, de la organizarea celulelor la procesele gndirii 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. Trim acum ntr-o societate a informaiei, un ev al informaiei. Privim modele de prelucrare a informaiei pentru a ne explica propriile noastre modele de gndire. Teorii bazate pe conceptul de informaie 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 tradiionale de calcul i eviden a datelor printr-o nou industrie de prelucrare a datelor, devenind astfel nucleul tehnologiei moderne a informaiei. Nscut odat cu calculatorul electronic, informatica (Computer science, Informatique, Informatik) a evoluat ncet pn n anii '60, cnd a nceput s capete form, reunind subiecte din logica matematic (automate, teoria demonstraiei, teoria funciilor recursive), lingvistica matematic i analiza numeric (algoritmi), adugndu-le probleme de organizare a informaiilor(structuri de date) i legtura ntre arhitectura calculatorului i modele de prelucrare a informaiei. Ea s-a dezvoltat pe msur ce viteza i puterea de calcul au crescut. Denumirea de informatic vine de la franuzescul informatique (informationinformaie + automatiqueautomat). MOMENTE DE REFERIN

Apariia tranzistorului la 3 iunie 1948 cnd Walter Brattain, William Shockley i metalurgitii Scaff, Teurer i Bardeen au fcut prima demonstraie 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 attea momente de revoluie tehnologic i de accelerare pentru informatic. Un astfel de moment a fost i apariia ingineriei programrii (software engineering), n anul 1967, ca termen att 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 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), fr a
2

mai vorbi de diverse alte limbaje specializate. Tendina este crearea unor limbaje artificiale din ce n ce mai apropiate de limbajul natural. Aa a devenit calculatorul tot mai prietenos i mai uor de folosit pentru sarcini tot mai complexe; aceast cutie minunat ne ajut acum s vedem adevruri pe care nu le intuisem, s vedem mai bine i mai departe n necunoscut, s scpm de munca de rutin i s eliberm mintea pentru a gndi mai profund. El nu se substituie omului, este nsa deja o unealt indispensabil, este esenial pentru eliberarea omului de un fel de munc, nsoindu-l ns, pentru c mintea astfel eliberat se va concentra ctre nivelul superior n cutarea adevrului. n faa unor probleme grele dintr-un anumit domeniu, omul va beneficia prin calculator de toat experiena precedent n domeniul respectiv, mintea sa avnd o sarcin dificil: s fac, ajutat de main, acea legtur logic de care maina 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 su de atunci fiind de 150.000$.Acesta a fost construit n special pentru calcule balistice. Numerele au fost primele informaii prelucrate de calculatoare. Dispozitivele electronice care intr astzi n construcia calculatoarelor numerice de astzi au din punct de vedere electronic dou stri posibile: conduc sau nu curentul electric; putem nota aceste stri cu 1 i respectiv 0.Este o convenie, pornit ns de la justificri 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 funcional cele dou notaii sunt la fel de bune. Deci un astfel de dispozitiv are dou stri echiprobabile posibile (2) i este similar unui ntreruptor simplu sau unui bec, care poate fi aprins sau stins. Dac astfel de dispozitive asigur patru stri (2) dou becuri pot fi amndou aprinse, amndou stinse, unul aprins i cellalt stins, i invers trei dispozitive au 8 stri (2), n dispozitive au 2 la puterea n stri posibile,2. REPREZENTAREA INFORMAIEI NUMERICE

Calculatorul opereaz cu numere n baza 2, pentru simplul motiv c, tehnologic, a fost convenabil materializarea a dou stri. Este comod s realizezi strile conectat (1), deconectat (0) cu un releu, sau saturat (0), blocat (1) cu un tranzistor. O cifr binar se numete bit (b), o grup de 4 bii se numete nible iar o grup de 8 bii se numete octet sau byte. 1 byte = 1B = 8 bit 1 kbit = 1 Kb = 2 bit = 1024 bit 1 kbyte = 1 KB = 2 byte = 1024 byte 1 Mbit = 1 Mb = 2 bit = 1048576 bit 1 Mbyte = 1MB = 2 byte = 1048576 byte 1GB = 1024 MB Un byte este informaia transmis de 8 bii, pentru c celor 8 bii le corespund combinaii, iar

log

256 = 8 adic un byte.

Calculatorul, opernd numai cu informaie binar, nseamn c indiferent de semnificaie (numere, caractere alfa-numerice sau instruciuni), ntreaga informaie din calculatorul numeric este binar, 0 sau 1.
3

SCURT ISTORIC AL APARIIEI CALCULATOARELOR

Dup reprezentarea intern a informaiei 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 privete calculatorul numeric, folosirea mainii a nceput n Orientul mijlociu cu folosirea pietrelor. Babilonienii au dezvoltat ideea prin inventarea abacului (dispozitiv de numrare 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 numeraie arbesc, care s-a rspndit i n Europa. Acest sistem a solicitat dezvoltarea i nelegerea unei teorii complicate a numerelor. Pe la 1600 Napier (care a avut contribuii i n dezvoltarea logaritmilor i aplicaiilor lor practice) a introdus o serie de beioare care puteau fi folosite pentru nmulire. Aceasta este posibil s fi fost predecesorul riglei de calcul. ntre 1640-1675 au loc realizri ale lui Pascal, Decartes, Leibniz. Un exemplu de main mai complicat este Pascalina, inventat de Blaise Pascal. n 1791, Babbage, matematician englez, a dezvoltat mpreun cu Ada Byron (fiica lordului Byron) ideile a dou maini de calculat mecanice. ntre 1801-1804, englezul Jaquard a construit o main de esut ce funciona cu ajutorul cartelelor perforate. Prima, main de diferene era destinat rezolvrii ecuaiilor polinomiale prin metoda diferenelor. A doua, maina analitic, era destinat ca main de calcul de uz general. Dei nepuse n practic, din cauza limitrilor tehnologice de atunci, aceste proiecte au lansat concepte nc actuale. Pe la 1880 Herman Hollerith, funcionar 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 fcut o firm, aa numita Tabulating Machine Company (transformat mai trziu n IBM). Al doilea rzboi mondial a constituit impulsul realizrii unor maini performante. Sub conducerea lui Aitken, ntre 1937-1944, la Universitatea Harward, s-a construit Mark I, o main electromecanic, cu relee, construit de IBM pentru U.S. Navy. Mai trziu, Colossus a fost construit de englezi n scopul decodificrii transmisiilor radio germane. ABC (Atanasoff-Berry Computer) a fost primul calculator cu adevrat electronic. ENIAC, construit de o echip condus de Eckert, la Universitatea din Pennsylvania, a fost ns primul calculator electronic adevrat, n sensul c poseda i memorie, aa c schimbarea programelor nu mai nsemna recablare, aa cum se ntmpl la ABC. Urmeaz apoi EDVAC (Electronic Discret Variable Automatic Computer) construit de aceeai echip ntre 1945-1949. n 1951 se construiete primul calculator destinat scopurilor comerciale, UNIVAC. Calculatoarele numerice pot fi de uz general sau specializate, n ultimul caz ele echipnd sisteme care asigur numai o singur aplicaie. Suntem acum n plin desfurare a generaiei a cincea de calculatoare. Pe scurt, succesiunea a fost urmtoarea:
4

Generaia I (1946-1956) cu relee, logic prin excelen cablat, dar i tuburi electronice, limbaje de asamblare. - Generaia II-a (1957-1963) cu tuburi electronice, limbaje de nivel nalt (Fortran, Cobol). - Generaia III-a (1964-1981) cu circuite integrate pe scar larg LSI (Large Scale Integration), memorii semiconductoare, limbaje de nivel foarte nalt (Pascal, Lips). - Generaia IV-a (1982-1992) circuite integrate pe scar foarte larg VLSI (Very Large Scale Integration), limbaje orientate obiect (Lisp,C). - Generaia a V-a (1992-prezent) circuite integrate pe scar ultralarg ULSI, programare funcional, prelucrare simbolic, sisteme expert evoluate, limbaje concurente, limbaje naturale. ntr-un anumit sens, istoria calculatoarelor personale care formeaz acum clasa mainilor cele mai rspndite, a nceput n 1974, cnd firma Intel a produs microprocesorul 8080, care coninea 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. n 1978 Intel a produs microprocesorul 8086 a crui 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 fee active, dublnd astfel capacitatea (320 KB). n august 1982 a fost introdus placa grafic Hercules care a permis mrirea rezoluiei grafice. Ca pachet de programe, LOTUS 123 (spreadsheet), a permis noului IBM PC cucerirea unei largi audiene n rndul utilizatorilor. n 1981 IBM a nceput proiectarea primului calculator personal serios, primul PC n accepiunea modern, folosind ca procesor 8088, strns nrudit cu 8086 avnd un display color monocrom CGA. Prin concepia sa modular i prin structura deschis, noul produs a cucerit curnd piaa. 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 funcioneaz ca i IBM BIOS fr a-l fi copiat. BIOS nseamn (input and output system) i este nucleul programelor (software) eseniale 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 o nou versiune DOS 3.0 care administreaz o nou generaie de discuri magnetice flexibile (1.2 MB). n1985 firma Microsoft scoate noul mediu grafic Windows. n acelai an apare DOS 3.2 care poate lucra i cu dischete de 3,5 inch de capacitate 720KB.DOS poate adresa acum pn 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.0 1990. Microsoft introduce Windows versiunea 3.0, nc actual. Folosirea 5

programelor este mai productiv avnd la dispoziie ferestre grafice soft multiple i posibilitatea de a comuta ntre mai multe sarcini soft active pe ecran. Dar Windows poate funciona acceptabil, numai pe maini mai puternice, de exemplu ele coninnd microprocesorul 386 DX sau 386 SX. n iunie 1991 apare DOS 5.0, incluznd caracteristici noi: interfa prietenoas cu utilizatorul, editor inclus, opiuni unformat/unerase, un interpretor Basic mbuntit. 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 fr fir permit fiecrui calculator s se conecteze oriunde n lume. Apoi a fost posibil structurarea Internetului, marea magistral informatic actual. Metoda BACKTRACKING La dispoziia celor care rezolv probleme cu ajutorul calculatorului exist mai multe metode . Dintre acestea cel mai des utilizate sunt: metoda metoda metoda metoda Greedy; Divide et impera; Branch and Bound; Backtracking;

Metoda Backtracking se aplic problemelor n care soluia poate fi reprezentat sub forma unui vector x = (x1, x2, x3, xk, xn) S, unde S este mulimea soluiilor problemei i S = S1 x S2 x x Sn, i Si sunt mulimi finite avnd s elemente si xi si , ()i = 1..n. Pentru fiecare problem se dau relaii ntre componentele vectorului x, care sunt numite condiii interne; soluiile posibile care satisfac condiiile interne se numesc soluii rezultat. Metoda de generare a tuturor soluiilor posibile si apoi de determinare a soluiilor rezultat prin verificarea ndeplinirii condiiilor interne necesit foarte mult timp. Metoda backtracking evit aceast generare i este mai eficient. Elementele vectorului x, primesc pe rnd valori n ordinea cresctoare 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 condiii de continuare referitoare la x1 x[k-1]. Daca aceste condiii nu 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 soluie rezultat. Metoda backtracking construiete un vector soluie n mod progresiv ncepnd cu prima component a vectorului i mergnd 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 x1x[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 condiiilor de continuare. Pot aprea urmtoarele situaii : a) x[k] ndeplinete condiiile de continuare. Daca s-a ajuns la soluia final (k = n) atunci se afieaz soluia obinut. Daca nu s-a ajuns la soluia final se trece la generarea elementului urmtor x [k-1]; b) x[k] nu ndeplinete condiiile de continuare. Se ncearc urmtoarea
6

valoare disponibila din S[k]. Daca nu se gsete nici o valoare n S[k] care s ndeplineasc condiiile de continuare, se revine la elementul x[k-1] i se reia algoritmul pentru o nou valoare a acestuia. Algoritmul se ncheie cnd au fost luate in considerare toate elementele lui S1. Este o tehnica de programare aplicabila algoritmilor care ofer mai multe soluii i are ca rezultat obinerea tuturor soluiilor problemei. Fiecare soluie se memoreaz ntr-o structura de date de tip stiv implementat cu ajutorul unui vector. Deci fiecare soluie poate fi pus sub forma unui vector. ntr-un algoritm backtracking ne intereseaz toate soluiile posibile. Pentru a obine fiecare soluie final se completeaz stiva nivel cu nivel trecnd astfel prin nite soluii pariale. Astfel soluiile finale ct i cele pariale pentru a fi luate n considerare trebuie s ndeplineasc anumite condiii numite condiii de validare. O soluie care ndeplinete o astfel de condiie se numete soluie valid. Toate configuraiile stivei ce reprezint soluii finale sunt alctuite din elementele aceleiai mulimi bine definite pe care o numim mulimea soluiilor. Fiecare nou soluie parial se obine prin completarea soluiei pariale precedente cu nc o nivel pe stiv. La fiecare nivel se pun valori din mulimea soluiilor care nu au fost ncercate pn cnd se obine o soluie valid. n acest moment se trece la nivelul urmtor n stiv pentru a completa mai departe soluia relund ncercrile pe noul nivel. La un moment dat pe un anumit nivel nu mai exist nici o valoare nencercat din mulimea valorilor problemei. n acest caz se face un pas napoi n stiv la nivelul anterior i se reia cutarea cu valorile rmase nencercate pe acest nivel anterior. Respectivul nivel a mai fost vizitat dar l-am abandonat dup ce am pus o valoare care a generat o soluie valid. Deci este posibil s fi rmas aici valori nencercate. Dac nici pe acest nivel nu mai avem valori nencercate mai facem un pas napoi n stiv. Mecanismul revenirilor a determinat denumirea de metoda backtracking . Plecnd de la nivelul 1 i repetnd algoritmul pn cnd pe toate nivelele au fost ncercate toate valorile din mulimea valorilor se obin soluii finale care se tipresc. Vom implementa metoda backtracking iterativ folosind o rutin unic aplicabil oricrei probleme. Rutina va apela proceduri i funcii care au ntotdeauna acelai nume i parametri i care din punct de vedere al metodei realizeaz acelai lucru. Sarcina rezolvatorului este s scrie explicit - pentru fiecare problem - procedurile i funciile aplicate pe rutin. Astfel gsirea urmtorului element netestat de pe un nivel k al stivei St se face cu procedura succesor (as,St,k) Odat ales un element testarea condiiilor de validare se face cu procedura valid (ev,St,k). Testul dac s-a ajuns sau nu la o soluie final se face cu funcia soluie (k) Soluia se tiprete cu procedura tipar. De asemenea fiecare nivel al stivei trebuie iniializat cu o valoare aflat naintea tuturor valorilor posibile din mulimea soluiilor. Aceast afiare se face cu procedura init (k,St) .

Rutina Backtracking K:=1; init (1,St); while k>0 do


7

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;

begin

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 afieze toate turnurile care se pot forma lund k cuburi din cele n disponibile, astfel nct: -laturile cuburilor din turn sa fie in ordine cresctoare; -culorile a oricare doua cuburi alturate din turn sa fie diferite.

program cuburi; 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); begin st[k]:=0;
8

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; begin ev:=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; begin solutie:=(k=p); end; procedure tipar; var i:integer; begin for i:=1 to p do write(st[i],' '); writeln; end; begin write('n= ');read(n); write('p= ');read(p); for i:=1 to n do begin write('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 opionale un elev trebuie s aleag 3. S se afieze toate posibilitile 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); begin if k>1 then st[k]:=st[k-1] else if k=1 then st[k]:=0; end; procedure succesor(var as:boolean;var st:stiva;k:integer); begin if 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; begin ev:=true; for i:=1 to k-1 do if st[i]=st[k] then ev:=false; end; function solutie(k:integer):boolean; begin solutie:=(k=p); end; procedure tipar; var i:integer; begin for 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
10

end; readln; end.

else k:=k-1;

k:=k+1; init(k,st) end

Numerele care i plac lui Irinel

Lui IRINEL i plac nr. formate numai din cifre pare cifre aflate n ordin_______esctoare. S se determine i s se afieze pe ecran toate nr. de n cifre (0<n<10) care i plac lui Gigel. Valoarea lui n este un nr. natural care se citete 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); begin st[k]:=-1; end; procedure succesor(var as:boolean;var st:stiva;k:integer); begin if 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; begin ev:=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; 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]);
11

writeln; end; begin write('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); begin st[k]:=1; 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; begin ev:=true; if a[st[k-1],st[k]]=0 then ev:=false else
12

for 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:=false end; function solutie(k:integer):boolean; begin solutie:=(k=n) end; procedure tipar; var i:integer; begin for i:=1 to n do write('nodul=',st[i]); writeln('------'); end; begin write('nr. de noduri=');readln(n); for i:= 1 to n do for j:=1 to i-1 do begin write('a[',i,',',j,']='); readln(a[i,j]); 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);
13

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: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; begin solutie:=(k=n); end; procedure tipar; var i:integer; begin for i:=1 to n do write(st[i]); writeln; end; begin write('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; 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;
14

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; begin s:=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; begin solutie:=(s=n); end; procedure tipar; var i:integer; begin for i:=1 to k do write(st[i]); writeln; end; begin write('n=');readln(n); 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 PARANTEZE program paranteze; type stiva=array[1..100] of integer;


15

var st:stiva; npd,npi,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]<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; begin npd:=0; npi:=0; for i:=1 to k do if 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; begin solutie:=(k=n); end; procedure tipar; var i:integer; begin if npd=npi then for I:=1 to k do if st[i]=1 then write('(') else write(')'); writeln; begin write('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
16

end; readln; end.

else k:=k-1;

k:=k+1; init(k,st) end

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 do s:=s+st[i]; if s<=n then ev:=true else ev:=false; 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 ('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);
17

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; 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 begin write('a[',i,']=');readln(a[i]);
18

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 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); 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; begin ev:=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; begin solutie:=(k=n);


19

end; procedure tipar; var i:integer; begin for i:=1 to n do write(a[st[i]],' '); writeln; end; begin write('n=');readln(n); for i:=1 to n do begin write('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; end; procedure interc(p,q,m:integer;var a:vector); var b:vector; i,j,k:integer; begin
20

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 else for 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; end end; procedure divimp(p,q:integer; var a:vector); var m:integer; begin if (q-p)<=1 then sort(p,q,a) else begin m:=(p+q) div 2; divimp(p,m,a); divimp(m+1,q,a); interc(p.q.m.a); end end; write('n= ');read(n); for i:=1 to n do begin write('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;
21

n:integer; procedure hanoi(n:integer;a,b,c:char); begin if 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; begin write('n=');readln(n); a:='a';b:='b';c:='c'; hanoi(n,a,b,c); readln; end.

Bibliografie
1.Tudor Sorin-Tehnici de programare 2.Cristian Udrea-Pascal Teorie si Aplicatii

22

S-ar putea să vă placă și