21
Probleme Backtracking Pop Paula-XI B

Probleme Backtracking

  • Upload
    moshe

  • View
    64

  • Download
    6

Embed Size (px)

DESCRIPTION

Probleme Backtracking. Pop Paula-XI B. 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]:=0; end; - PowerPoint PPT Presentation

Citation preview

Page 1: Probleme Backtracking

Probleme Backtracking

Pop Paula-XI B

Page 2: Probleme Backtracking

• 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]:=0;• end;• procedure succesor(var as:boolean; var st:stiva; k:integer);• begin• if st[k] < 4 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]=st[k]) and (a[i,k]=1) then ev:false• end;• function solutie(k:integer):integer;• Begin solutie:=(k=n); end;• procedure tipar;• vari:integer; begin• for i:= 1 to n do writeln(’Tara =’, i,’; culoarea=’,st[i]);• writeln(’===================’) end;• begin• write(’Numarul de tari = ’);• readln(n);• for i:= 1 to n do for j:=1 to i-1 do begin• write(’a[’,i,’,’,j,’]=’); readln(a[i,j]) 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-1end• end.

Page 3: Probleme Backtracking

• 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]as:=true endelse 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;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 repeatsuccesor(as,st,k);if as then valid(ev,st,k);until (not as) or (as and ev);if as then if solutie(k) then tiparelse begink:=k+1;init(k,st); endelse k:=k-1; end;readln;end.

Page 4: Probleme Backtracking

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);beginst[k]:=0;end;procedure succesor(var as:boolean;var st:stiva;k:integer);beginif st[k]<="" font="" then="">st[k]:=st[k]+1;as:=true;endelse as:=false; end;procedure valid(var ev:boolean;st:stiva;k:integer);var i:integer;beginev:=true;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('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);endelse k:=k-1;end; end.

Page 5: Probleme Backtracking

var st:array[1..25] of integer;i,n,p:integer;procedure init;beginwrite('N='); readln(n);for i:=1 to 25 dost[i]:=0;end;function valid(p:integer):boolean;beginvalid:=true;for i:=1 to p-1 doif st[i]=st[p] then valid:=false;end;procedure tipar(p:integer);var i:integer;beginfor i:=1 to p dowriteln(st[i],' ');end;procedure back(p:integer);beginp:=1; st[p]:=0;while p>0 dobeginif st[p]<n then beginst[p]:=st[p]+1;if valid(p) thenif p=n then tipar(p)else beginp:=p+1;st[p]:=0; end;end; else p:=p-1; end;end;begininit;back(1);end.

Page 6: Probleme Backtracking

type stiva=array [1..10] of integer;var st:stiva;    ev,as:boolean;    n,k,p: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;beginev:=true;for i:=1 to k-1 do if st[i]=st[k] then ev:=false;if (k>2) and (st[k-1]>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;write ('n:=');readln (n);write ('p:=');readln (p);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.

Page 7: Probleme Backtracking

var n, ns: byte;sol: array[1..20] of byte;procedure afis(l: byte);var i: byte;begininc(ns);write 'Solutia ', ns, ' : ');for i:=1 to l dowrite(sol[i]:3);writeln;end;procedure back(i, sp: byte);var j: byte;beginif sp = n then afis(i-1)else for j:=1 to n-sp doif (j>=sol[i-1])then beginsol[i]:=j;back(i+1, sp+j)                 end;end;beginread(n);ns:=0;back(1,0);writeln(ns,'solutii');end.

Page 8: Probleme Backtracking

const nmax=7;type vector=array[1..nmax] of integer;=(1,5,10,50,100,200,500); valori=array[1..nmax] of integer;var x,max:vector;v:valori;s,s1,i,k,n:integer;s:integer;function exista(k:integer):boolean;beginexista:=(k<=n) and (x[k]<max[k])< font=""></max[k])<>end;function cont(k:integer):boolean;begins1:=0;for i:=1 to k dos1:=s1+x[i]*v[i];cont:=(s1<=s);end;function solutie(k:integer):boolean;beginif k=n then begins1:=0;for i:=1 to k dos1:=s1+x[i]*v[i];solutie:=(s1=s);endelsesolutie:=false;end;

Page 9: Probleme Backtracking

procedure tipar(k:integer);beginfor i:=1 to k doif x[i]<>0 then write(x[i]:3,'de',v[i],'lei');writeln;end;procedure bktr;begink:=1;x[k]:=-1;while k>0 doif exista(k) then beginx[k]:=x[k]+1;if cont(k) thenif solutie(k) then tipar(k)else begink:=k+1;x[k]:=-1;end;endelse k:=k-1;end;beginclrscr;write('n='); readln(n);writeln('valorile monedelor:');for i:=1 to n do beginwrite('v[',i,']=');readln(v[i]); end;write('suma necesara:');readln(s);for i:=1 to n do max[i]:=s div v[i];bktr;end.

Page 10: Probleme Backtracking

Type vector=array[1..20] of integer;Var x:vector;N,p:integer;Procedure solutie;Var i:integer;BeginFor i:= 1 to p doWrite(‘x[i],’ ‘);End;Function continuare(k:integer);boolean;Var i:integer;BeginContinuare:=true;For i:= 1 to k-1 doIf x[i]=x[k] then continuare:=false;End;Procedure back(k:integer);Var i:integerBeginIf (k=p+1) then solutie Else for i:= 1 to n doBeginX[k]:=1;If continuare (k) then back (k+1)End;Begin write(’n=’); readln(n);Write(‘p=’); readln(p);Back(1);End.

Page 11: Probleme Backtracking

Probleme Backtracking-GRILE-

Page 12: Probleme Backtracking

1. (var1) Utilizând metoda backtracking se generează în ordinelexicografică cuvintele de câte patru litere din mulţimeaA={a,b,c,d,e}, cuvinte care nu conţin două vocale alăturate. Primele opt cuvinte generate sunt, în ordine: abab, abac, abad, abba, abbb, abbc, abbd, abbe.Câte dintre cuvintele generate încep cu litera b şi se termină cu litera e? a. 9 b. 15 c. 12 d. 20

2. (var2) Utilizând metoda backtracking se generează în ordinelexicografică cuvintele de câte patru litere din mulţimeaA={a,b,c,d,e}, cuvinte care nu conţin două vocale alăturate. Primele opt cuvinte generate sunt, în ordine: abab, abac, abad, abba, abbb, abbc, abbd, abbe. Care este ultimul cuvânt generat? a. edcb b. eeee c. edde d. eded

Page 13: Probleme Backtracking

3. Utilizând metoda backtracking se generează în ordine lexicografică cuvintele de câte patru litere din mulţimea A={a,b,c,d,e}, cuvinte care nu conţin două vocale alăturate. Primele opt cuvinte generate sunt, în ordine: abab, abac, abad, abba, abbb, abbc, abbd, abbe.Care este penultimul cuvânt generat? a. edec b. eded c. edde d. edcb

4. Utilizând metoda backtracking se generează în ordine lexicografică cuvintele de câte patru litere din mulţimea A={a,b,c,d,e}, cuvinte care nu conţin două vocale alăturate. Primele opt cuvinte generate sunt, în ordine: abab, abac, abad, abba, abbb, abbc, abbd, abbe. Care este antepenultimul

cuvânt generat? a. edde b. eddb c. edec

Page 14: Probleme Backtracking

5. Folosind modelul combinărilor se generează numerelenaturale 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, înordine: 123, 127, 137, 237. Dacă se utilizează exact aceeaşitehnică pentru a genera numerele naturale cu patru cifredistincte din mulţimea {1,2,3,4,5,6,7,8}, câte dintre numerelegenerate au prima cifră 2 şi ultima cifră 7? a. 8 b. 3 c. 4 d. 6C de 4 cate 2= 4!\ 2! *2!=6

6. Utilizând metoda backtracking sunt generate numerele de 3 cifre, având toate cifrele distincte şi cu proprietatea că cifrele aflate pe poziţii consecutive sunt de paritate diferită. Ştiind că primele şase soluţii generate sunt, înaceastă ordine, 103, 105, 107, 109, 123, 125, care este a zeceasoluţie generată? a. 145 b. 147 c. 230 d. 149

Page 15: Probleme Backtracking

7. Utilizând metoda backtracking sunt generate numerele de 3 cifre care au cifrele în ordine crescătoare, iarcifrele 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 este cel de al 8-lea numărgenerat? a. 169 b. 149 c. 167 d. 147

8. Un algoritm de tip backtracking generează, în ordinelexicografică, toate şirurile de 5 cifre 0 şi 1 cu proprietatea că nu există mai mult de două cifre 0 pe poziţii consecutive. Primele 7 soluţii generate sunt: 00100, 00101, 00110, 00111, 01001, 01010, 01011. Care este a 8-a soluţie generată de acestalgoritm? a. 01110 b. 01100 c. 01011 d. 01101

Page 16: Probleme Backtracking

9. Folosind tehnica bactracking un elev a scris un program care generează toate numerele de câte n cifre(0<n≤9), cifrele fiind în ordine strict crescătoare. Dacă n este egal cu 5, câte numere vor fi generate de program?

Combinari de 9 luate cate 5=126

10. Utilizând metoda backtracking, sunt generate toate numerele de 3 cifre, astfel încât cifrele sunt în ordinecrescătoare, iar cifrele aflate pe poziţii consecutive sunt de paritate diferită. Ştiind că primele trei soluţii generate sunt, în această ordine, 123, 125, 127, câte dintre toatenumerele generate au suma cifrelor egală cu 6?

Doar 1 si anume 125

Page 17: Probleme Backtracking

11. Folosind tehnica backtracking, un elev a scris un program care generează toate numerele de câte n cifre (1≤n≤9), cifrele fiind în ordine strict crescătoare. Dacă n este egal cu 5, câte dintrenumerele generate au prima cifră 4? Combinari de 5 luate cate 4=5

12. Pentru a scrie valoarea 10 ca sumă de numere prime se foloseşte metoda backtracking şise generează, în această ordine, sumele distincte: 2+2+2+2+2, 2+2+3+3, 2+3+5, 3+7, 5+5. Folosindexact aceeaşi metodă, se scrie valoarea 9 ca sumăde numere prime. Care sunt primele trei soluţii, înordinea generării lor? 2+2+2+3;;;2+2+5;;;2+7

Page 18: Probleme Backtracking

13. Trei băieţi, Alin, Bogdan şi Ciprian, şi trei fete, Delia, Elena şi Felicia, trebuie să formeze o echipă de 3 copii, care săparticipe la un concurs. Echipa trebuie să fie mixtă (adică săconţină cel puţin o fată şi cel puţin un băiat). Ordinea copiilorîn echipă este importantă deoarece aceasta va fi ordinea de intrare a copiilor în concurs (de exemplu echipa Alin, Bogdan, Delia este diferită de echipa Bogdan, Alin, Delia). Câte echipese pot forma, astfel încât din ele să facă parte simultan Alin şiBogdan? 18 variante

14. Un algoritm generează în ordine crescătoare toatenumerele de n cifre, folosind doar cifrele 3, 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ţi generate, în

ordinea generării. 77773;;77775;;77777

Page 19: Probleme Backtracking

15.Se generaza toate cvintele de n litere din multimea [ a,b,c,d] astfel incat sa nu existe vecine sau un caracter a alatura c. Ultimele 3 cuvinte generate de lungime 2 sunt ba,ad,ab. Daca se utilizeaza aceeasi tehnica pentru a genera cuvinte de 3 lietere, antepenultimul este?? A) ada, B)abc c)abd d)aba

16. Se generaza toate cvintele de n litere din multimea [ a,b,c,d] astfel incat sa nu existe vecine sau un caracter a alatura c. Ultimele 3 cuvinte generate de lungime 2 sunt ba,ad,ab. Daca se utilizeaza aceeasi tehnica pentru a genera cuvinte de 4 litere. Al 3-lea cuvant este??A) dcdc b)abcd c) dcdc d)dcda

Page 20: Probleme Backtracking

17.Se generaza toate cvintele de n litere din multimea [ a,b,c,d] astfel incat sa nu existe vecine sau un caracter a alatura c. Numarul total de cuvinte de 3 litere generate este??A)26 b)50 c)21 d)15R:7 varinte pt fiecare litera , deci 7*4 din care scadem 2 =26

18. Se generaza toate cvintele de n litere din multimea [ a,b,c,d] astfel incat sa nu existe vecine identice si nici a sau b.Ultimele 3 cuvinte de 2 litere sunt: “da”, “db”, “dc”. Antepenultimul cuvant generat de 3 litere este??A) dbd b)dca c)dcb d)dcd

Page 21: Probleme Backtracking

19.Se generaza toate cvintele de n litere din multimea [ a,b,c,d] astfel incat sa nu existe vecine identice si nici a sau b.Ultimele 3 cuvinte de 2 litere sunt: “da”, “db”, “dc”.Daca se utilizeaza aceeasi tehnica si pentru cuvintele de 4 litere, al 3 lea cuvant generat este??A)dcab b)acac c)acdc d)acac

20.Se genereaza in ordine crescatoare numerele toate de 5 cifre distincte cu [2,3,4,5,6]. Numarul generat inainte si dupa secventa este??

32654<-----34256,,,34265,,,34526,,,34562--34625