220 likes | 363 Views
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;
E N D
Probleme Backtracking Pop Paula-XI B
Typestiva = array [1…100] of integer; • Varst : 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] < 4thenbeginst[k]:=st[k]+1;as:trueendelseas: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]=st[k]) and (a[i,k]=1)thenev:false • end; • function solutie(k:integer):integer; • Beginsolutie:=(k=n);end; • procedure tipar; • vari:integer;begin • for i:= 1 to n dowriteln(’Tara =’, i,’; culoarea=’,st[i]); • writeln(’===================’)end; • begin • write(’Numarul de tari = ’); • readln(n); • for i:= 1 to n dofor j:=1 to i-1 dobegin • write(’a[’,i,’,’,j,’]=’);readln(a[i,j])end; • k:=1; • init(k,st); • while k>0 do • begin • Repeatsuccesor(as,st,k);if as • Thenvalid(ev,st,k); • until (not as) or (as and ev);if as then • if solutie (k)thentiparelsebegink:=k+1;init(k,st)end • else k:=k-1end • end. Colorarea hartilor
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. Problema damelor
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. Produsul Cartezian
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. Generarea permutarilor
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. Generarea combinarilor
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. Partitia unui numar natural
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; Plata unei sume
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. Plata unei sume
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. Generarea aranjamentelor
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. 202. (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
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. edcb4. 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
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!=66. 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
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. 1478. 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
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
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=512. 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
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 variante14. 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
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)aba16. 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
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 =2618. 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
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)acac20.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