350 likes | 707 Views
Probleme la metoda backtracking. 1. G enerarea permutărilor Se citeşte un număr natural n. Să se genereze permutările de n elemente ale mulţimii {1,2,…,n}. Simulaţi executarea algoritmului pentru n=3. Type vector = array[1..100] of integer; Var x:vector; n: integer;
E N D
1.Generarea permutărilor Se citeşte un număr natural n. Să se genereze permutările de n elemente ale mulţimii {1,2,…,n}. Simulaţiexecutareaalgoritmuluipentru n=3. Type vector = array[1..100] of integer; Var x:vector; n: integer; Procedure solutie; Var i: integer; Begin Write (‘(‘); For i:= 1 to do write (x[i],’,’); Writeln (x[n],’)’) End; Function continuare (k:integer):Boolean; Var i:integer; ok:Boolean; Begin Ok:= true ; If k = 1 then continuare:= true Else if i:= 1 to k-1 do if x[k]=x[i] then ok:= false Continuare:= ok; End;
Procedure back (K:integer); Var i:integer; Begin If (k=n+1) then solutie Else Begin For i:= 1 to n do Begin x[k]:=I ; If continuare (k) then back (k+1); End; End; End; Begin Write (‘n=’); readln (n); Back(1); Readln; End. Pt n=3 se genereaza: (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1),
2.Generarea permutărilor unui vector Se citesc cele n elemente ale unui vector a de numere întregi. Să se genereze permutările de n elemente ale mulţimii {a1,a2,…,an}. Simulaţiexecutareaalgoritmuluipentru n=3. Type vector= array[1..20] of integer Var a,x: vector; Procedure citire ( var n:integer; var a:vector); Var i:integer; Begin Write (‘n=’); readln (n); For i:=1 to n do Begin Write (‘a[‘,i,’]=’); Readln (a[i]) End; End; Procedure solutie; Var i:integer; Begin For i:=1 to n do Write (a[x[i]],’ ‘);Writeln; End;
Function continuare ( k:integer):Boolean; Var i:integer; Begin Continuare:= true; For i:= 1 to k-1 do if x[i]=x[k] then continuare := false; End; Procedure back (k:integer); Var i: integer; Begin If (k=n+1) then solutie Else for i:=1 to n do Begin X[k]:= i ; If continuare (k) then back ( k+1); End; End; Begin Citire (n,a); Back(1); End.
3.Generarea aranjamentelor Se citesc două numere naturale n şi p. Să se genereze toate aranjamentele de n elemente luate câte p ale mulţimii {1,2,…,n}. Simulaţiexecutareaalgoritmuluipentru n=4 şi p=2. Type vector= array [1..20] of integer; Var x:vector; N,p: integer; Procedure solutie; Var i:integer; Begin For i:= 1 to p do Write (x[i],’ ‘); End; Function continuare (k:integer):Boolean; Var i:integer; Begin Continuare:= true; For I:= 1 to k-1 do if x[i]=x[k] then continuare:= false; End;
Procedure back (K:integer); Var i: integer; Begin If ( k=p+1) then solutie Else for I:=1 to n do Begin W[k]:=I; If continuare (k) then back(k+1); End; End; Begin Write ( ‘n=’); readln(n); Write ( ‘p=’); readln(p); Back(1); End. Pentru n=4 si p=2 se genereaza: (1,2),(1,3),(1,4), (2,1),(2,3),(2,4), (3,1),(3,2),(3,4), (4,1),(4,2),(4,3)
4.Generarea combinărilor Se citesc două numere naturale n şi p. Să se genereze toate combinările de n elemente luate câte p ale mulţimii {1,2,…,n}. Simulaţiexecutareaalgoritmuluipentru n=4 şi p=2. Type vector = array [0..20] of integer; Var x:vector; N,p : integer; Procedure solutie; Var i: integer; Begin For i:=1 to p do write (x[i], ‘ ‘); Writeln; End; Procedure back ( k: integer); Var I : integer; Begin If (k=p+1) then solutie Else for i:= x[k-1]+1 to n do
Begin X[k]:=I; Back (k+1); End; End; Begin Write (‘n=’); readln (n); Write (‘p=’); readln (p); Back(1); End. Pentru n=4 si p=2 se genereaza: (1,2) (1,3) (1,4) (2,3) (2,4) (3,4)
5.Generarea partiţiilor unui număr natural Se citeşte numărul natural n. Să se genereze toate modurile de descompunere a lui n ca sumă de numere naturale. Simulaţiexecutareaalgoritmuluipentru n=5. Type vector = array [1..20] of integer Var x: vector; N,s: integer; Procedure solutie (k:integer); Var i: integer; Begin For i:= 1 to k do write (x[i], ‘ ‘); Writeln; End; Function continuare ( k: integer): Boolean; Begin Continuare:= ( x[k]+s)< n; End;
Procedure back (k:integer); Begin If (s=n) then solutie (k-1) Else Begin X[k]:=0; While continuare(k) do Begin X[k]:= x[k]+1; S:=s+x[k]; Back k(k+1); S:=s-x[k]; End; End; End; Begin Write(‘n=’); Readln(n); Back(1); Readln; End. Pentru n=5 Raspuns: 1+1+1+1+1; 1+1+1+2; 1+1+2+1; 1+2+1+1; 1+1+3; 1+3+1; 2+1+1+1; 2+1+2; 2+2+1; 3+1+1; 3+2; 4+1; 5+0.
6.Generarea submulţimilor Se citeşte numărul natural n. Să se genereze toate submulţimile mulţimii {1,2,…,n}. Simulaţiexecutareaalgoritmuluipentru n=3. Type stiva= array[1..20] of integer; Var x: stiva N,k: integer; Procedure solutie ; Var I : integer; Begin For i:= 1 to n do write (x[i], ‘ ‘);Writeln; End; End; Function continuare (k:integer):Boolean; Var I : integer; Begin Continuare:= true; End;
Procedure backtrack; Bagin K:=1; x[k]:= -1; While (k>0) do Begin while (x[k]<1) do Begin X[k]:= x[k]+1; If continuare (k) then if (k=n) then solutie Else begin K:=k+1; X[k]:= -1; End; End; K:=k-1; End; End; Begin Write (‘n=’); readln(n); Backtrack; End. Pentru n=3 si multimea {1,2,3} Submultimile generate sunt: {Ø},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}.
7.Problema colorării hărţilor Fiind data o hartă cu n ţări, se ceretoatesoluţiile de colorare a hărţii, utilizândcelmult 4 culori, astfelîncâtdouăţări cu frontierăcomunăsă fie coloratediferit. Const c:array[1..4] of char= (‘G’,’R’,’A’,’V’); Type vector= array[1..50] of integer; Matrice= array[1..50,1..50] of integer; Var A: matrice; X:vector; N:integer; Procedure citire (var n:integer; var A:matrice); Var I,j:integer; Begin Write (‘n=’); readln(n); For i:=1 to n do For j:=1 to n do Begin write (‘A[‘,I,’,’,j,’]=’); Readln ( A[I,j]) End; End; Procedure solutie; Var i: integer; Begin
For i:=1 to n do Writeln ( ‘tara’,I,’:’, C[x[i]]); End; Function continuare (k:integer):Boolean; Var i: integer; Begin Continuare := true ; For i:= 1 to k-1 do If ( A[I,k]=1) and ( x[i]=x[k]) then Continuare :=false End; Procedure back(k:integer); Var i:integer; Begin If(k=n+1) then solutie Else For i:= 1 to 4 do Begin x[k]:= i ; If continuare (k) then Back(k+1) End; End; Begin Citire (n,A); Back(1); End.
8.Săritura calului Se consideră o tablă de şahnxnşi un calplasatîncolţul din stânga, sus. Se ceresă se afişeze un drum al caluluipe table de şah, astfelîncâtsătreacă o singurădatăprinfiecarepătrat al tablei. Type vector= array [1..400] of integer; Matrice = array [1..20,1..20] of integer; Const dx : array [1..8] of integer = (-2,-1,1,2,2,1,-1,-2); Dy : array[1..8] of integer = (-1,-2,-2,-1,1,2,2,1); Var A: matrice; X,y:vector; N: integer; Procedure solutie; Var I,j:integer; Begin writeln; For i:= 1 to n do For j:= 1 to n do Begin Write ( A[I,j], ’ ‘); Writeln; End; End;
Function continuare ( k:integer):Boolean; Var ok:Boolean; Begin Ok:= true; If (x[k]<1) or (k[k]>n) or (y[k]<1) or (y[k]>n) Or ( A[x[k],y[k]]>0) Then ok:false; Continuare :=ok; End; Procedure back(k:integer); Var I:integer; Begin If (k= nxn+1) then solutie Else begin For i:=1 to 8 do
Begin X[k]:= x[k-1]+ dx[i]; Y[k]:=y[k-1]+dy[i]; A[x[k],y[k]]:=k; If continuare (k) then Back(k+1); A[x[k],y[k]]:=0; End; End; End; Begin Write ( ‘n=’); readln(n); X[1]:=1 , y[1]:= 1, A[1,1]:=1; Back(2); Readln; End.
9.Problema reginelor Să se determine toate posibilităţile de aranjare a n regine pe o tablă de şah de dimensiune nxn astfel încât reginele să nu se atace reciproc. Regina atacă piesele aflate pe aceeaşi linie, coloană sau diagonală. Type vector= array [1..30] of integer; Var x: vector; N: integer; Procedure solutie; Var i,j: integer; Begin Writeln; For i:= 1 to n do Begin For j:= 1 to n do If x[i]=j then write (‘*’) Else write (‘ ‘); Writeln; End; End; Function continuare (k:integer):Boolean; Var i:integer; ok:Boolean; Begin
ok:=true; For i:= 1 to k-1 do If (x[k]=x[i]) or (abs (x[k]-x[i])=(k-i)) then ok := false Continuare :=ok; End; Procedure back(k:integer); Var i:integer; Begin If ( k=n+1)then solutie Else Begin For i:= 1 to n do Begin X[k]:= i If continuare (k) then Back(k+1); End; End; End; Begin Write (‘n=’); readln(n); Back (1); Readln; End.
10.Problema turelor Să se determine toate posibilităţile de aranjare a n ture pe o tablă de şah de dimensiune nxn astfel încât turele să nu se atace reciproc. Tura atacă piesele aflate pe aceeaşi linie sau coloană. Type vector= array [1..30] of integer; Var x: vector; N: integer; Procedure solutie ; Var I,j: integer; Begin For i:= 1 to n do Begin For j:=1 to n do If x[i]=j then write (‘*’) Else write (‘ ‘); Writeln; End; End; Function continuare (k:integer):Boolean; Var i:integer; ok:Boolean; Begin Ok:= true ;
If k = 1 then continuare:= true Else if i:= 1 to k-1 do If x[k]=x[i] then ok:= false Continuare:= ok; End; Procedure back (K:integer); Var i:integer; Begin If (k=n+1) then solutie Else Begin For i:= 1 to n do Begin x[k]:=I ; If continuare (k) then back (k+1); End; End; End; Begin Write (‘n=’); readln (n); Back(1); Readln; End.
1. Folosind modelul combinărilor se generează numerele naturale cu câte trei cifre distincte din mulţimea {1,2,3,7}, numere cu cifrele în ordine strict crescătoare, obţinându-se, în ordine: 123, 127, 137, 237. Dacă se utilizează exact aceeaşi metodă pentru a genera numerele naturale cu patru cifre distincte din mulţimea {1,2,3,4,5,6,7,8}, câte dintre numerele generate au prima cifră 2 şi ultima cifră 7? 2347 2357 2367 2457 2467 2567 6 numere 2. Folosind tehnica bactracking un elev a scris un program care generează toate numerele decâte n cifre (0<n≤9), cifrele fiind în ordine strict crescătoare. Dacăn este egal cu 5, scriețiîn ordine crescătoare toate numerele având cifra unităților 6, care vor fi generate deprogram. 12346 , 12356 , 12456 , 13456 , 23456
3. Utilizând metoda backtracking sunt generate numerele de 3 cifre care au cifrele în ordinecrescătoare, iar cifrele aflate pe poziţii consecutive sunt de paritate diferită. Ştiind căprimele cinci soluţii generate sunt, în această ordine: 123, 125, 127, 129, 145, care estecel de al 8-lea număr generat? 123 125 127 129 145 147 149 167 4. Utilizând metoda backtracking sunt generate în ordine crescătoare toate numerele de 3cifre, astfel încât cifrele sunt în ordine crescătoare, iar cifrele aflate pe poziţiiconsecutivesunt de paritate diferită. Ştiind că primele trei soluţii generate sunt, în această ordine, 123,125, 127, scrieţi toate numerele generate care au suma cifrelor egală cu 12. 129 147 345
5. Utilizând metoda backtracking se generează permutările cuvântului info. Dacă primele treisoluţii generate sunt: fino, fion, fnio care este cea de-a cincea soluţie? Info fino fion fnio fnoi foin 1234 3124 3142 3214 3241 3412 6. Câte numere cu exact două cifre pot fi construite folosind doar cifre pare distincte? 24 26 28 42 46 48 62 64 68 82 84 86 12 numere 7. Un algoritm generează, în ordine lexicografică, toate şirurile alcătuite din câte n cifre binare(0 şi 1). Ştiind că pentru n=5, primele 4 soluţii generate sunt 00000, 00001, 00010, 00011, precizaţi care sunt ultimele 3 soluţii generate, în ordinea obţinerii lor. 11101 11110 11111
8. Un algoritm generează în ordine descrescătoare, toate numerele de n cifre (n<9), cu cifreleîn ordine strict crescătoare, care nu au două cifre pare alăturate. Dacă pentru n=5, primele5 soluţii generate sunt 56789, 45789, 45679, 45678, 36789, precizaţi care sunturmătoarele 3 soluţii generate, în ordinea obţinerii lor. 35679 35678 34789 • 9 Un program citeşte o valoare naturală nenulă impară pentru n şi apoi generează şi afişeazăîn ordine crescătoare lexicografic toate combinaţiile formate din n cifre care îndeplinescurmătoarele proprietăţi: • - încep şi se termină cu 0; • modulul diferenţei între oricare două cifre alăturate dintr-o combinaţie este 1.Astfel, pentru n=5, combinaţiile afişate sunt, în ordine, următoarele: 01010, 01210. Dacăse rulează acest program şi se citeşte pentru n valoarea 7, imediat dupăcombinaţia0101210 va fi afişată combinaţia: • a. 0121210 b. 0123210 c. 0111210 d. 0121010
10. Pentru generarea în ordine crescătoare a numerelor cu n cifre formate cu elementelemulţimii {0,2,8} se utilizează un algoritm backtracking care, pentru n=2, generează, înordine, numerele20,22,28,80,82,88.Dacă n=4 şi se utilizează acelaşi algoritm, precizaţi câte numere generate sunt divizibilecu 100? 2000 2200 8000 8800 2800 8200 6 numere 11. Având la dispoziţie cifrele 0, 1 şi 2 putem genera, în ordine crescătoare, numere care ausuma cifrelor egală cu 2 astfel încât primele 6 numere generate sunt, în această ordine: 2,11, 20, 101, 110, 200. Folosind acelaşi algoritm se generează numere cu cifrele 0, 1, 2 şi3 care au suma cifrelor egală cu 4. Care va fi al 7-lea număr din această generare ? 13 22 31 103 112 121 130
12. Generarea tuturor cuvintelor de trei litere mici, nu neapărat distincte, ale alfabetului englez,se poate realiza cu ajutorul unui algoritm echivalent cu cel de generare a: • produsului cartezian b. Combinărilor c. aranjamentelor • d. Permutărilor 13. Folosind un algoritm de generare putem obţine numere naturale de k cifre care au sumacifrelor egală cu un număr natural s. Astfel, pentru valorile k=2 şi s=6 se generează, înordine, numerele: 15, 24, 33, 42, 51, 60. Care va fi al treilea număr generat pentru k=4 şis=5? 1004 1013 1022 14. Utilizăm metoda backtracking pentru generarea tuturormodalităţilor de a scrie numărul 6 casumă a cel puţin două numere naturale nenule. Termenii fiecărei sume sunt în ordinecrescătoare. Soluţiile se generează în ordinea: 1+1+1+1+1+1, 1+1+1+1+2, 1+1+1+3,1+1+4, 1+5, 2+2+2, 2+4 şi 3+3. Se aplică exact aceeaşi metodă pentru scrierea lui 9.Câte soluţii de forma 2+... vor fi generate? 2+2+2+3 2+2+5 2+7 2+3+4 4 solutii
15. Completarea unui bilet de LOTO presupune colorarea a 6 numere dintre cele 49, înscrisepe bilet. O situaţie statistică pe o anumită perioadă de timp arată că cele mai frecventenumere care au fost extrase la LOTO sunt: 2, 20, 18, 38, 36, 42, 46, 48. Câte bilete de 6numere se pot completa folosind doar aceste valori, ştiind că numărul 42 va fi colorat pefiecare bilet? a. 21 b. 6! c. 42 d. 56 Combinari de 7 elemente luate cate 5 = 5040/ 240 = 21 16. În câte dintre permutările elementelor mulţimii {‘I’,’N’,’F’,’O’} vocalele apar pe poziţii consecutive? I O N F F I O N I O F N F O I N O I N F N F I O O I F N F N I O N O I F N F O I N I O F F N O I 12 permutari
17. Un algoritm generează în ordine crescătoare toate numerele de n cifre, folosind doar cifrele3, 5 şi 7. Dacă pentru n=5, primele 5 soluţii generate sunt 33333, 33335, 33337,33353, 33355, precizaţi care sunt ultimele 3 soluţii generate, în ordinea generării. 77773 77775 77777 18. Un algoritm generează în ordine crescătoare, toate numerele de n cifre (n<9), cu cifredistincte, care nu au două cifre pare alăturate. Dacă pentru n=5, primele 5 soluţii generatesunt 10325, 10327, 10329, 10345, 10347, precizaţi care sunt următoarele 4 soluţiigenerate, în ordinea obţinerii lor. 10349 10365 10367 10369
19. Utilizăm metoda backtracking pentru generarea tuturor modalităţilor de a scrie numărul 9 casumă a cel puţin două numere naturale nenule distincte. Termenii fiecărei sume sunt în ordine strict crescătoare. Soluţiile se generează în ordinea: 1+2+6, 1+3+5, 1+8, 2+3+4,2+7, 3+6 şi 4+5. Se aplică exact aceeaşi metodă pentru scrierea lui 12. Scrieţi, în ordineagenerării, toate soluţiile de forma 2+... 2+3+7 2+4+6 20. Generând şirurile de maximum 3 caractere distincte din mulţimea {A,B,C,D,E}, ordonatelexicografic, obţinem succesiv: A, AB, ABC, ABD,…. Ce şir va fi generat imediat după BAE? Notam literele cu cifre : A B C D E astfel se genereaza: 1 2 3 4 5 1 12 123 124 Dupa B A E se genereaza B C 2 1 5 2 3
Realizator : MadalinaBorzasi Cls. a XI-a B Prof. TomsaGelu