11. metode de elaborare a algoritmilorper/fp -_-/fp_12.pdf · 2014-11-27 · metoda backtracking...
TRANSCRIPT
11.11. MetodeMetode de de elaborareelaborare a a algoritmiloralgoritmilor
C_C_1212 / / 2121..12.212.2001212
1.1. MetodaMetoda GreedyGreedy
2.2. MetodaMetoda Divide et Divide et ImperaImpera
3.3. MetodaMetoda Back TrackingBack Tracking
4.4. MetodaMetoda ProgramăriiProgramării DinamiceDinamice
5.5. MetodaMetoda Branch and Bound Branch and Bound
6.6. MetodeMetode EuristiceEuristice
7.7. AlgoritmiAlgoritmi GeneticiGenetici
11.311.3 MetodaMetoda BackTrackingBackTracking
Metoda backtracking (căutare cu revenire) se utilizează dacă soluţia problemei se poate reprezenta sub forma unui vector X=(x1,x2,…,xn) S=S1S2…Sn, unde S este spaspaţţiuliul tuturortuturor valorilorvalorilor posibileposibile, iar Si sunt mulţimifinitefinite (1in).
Mulţimea rezultatelor este R = XS X îndeplineşte condicondiţţiile interneiile interne. Deci, condicondiţţiile interneiile interne sunt relaţii între componentele x1,x2,…,xn ale unui vector X pe care acestea trebuie să le îndeplinească pentru ca vectorul X să fie soluţie. Într-o problemă se pot cere toate soluţiile sau o singură soluţie care optimizează o funcţie obiectiv dată.
Prin metoda backtrackingbacktracking nu se generează toate valorile posibile din spaţiul stărilor (S). Vectorul X se completează secvenţial, atribuind componentei xk o valoare numai după ce au fost atribuite deja valori componentelor x1,x2,…,xk-1. Nu se va trece la componenta xk+1, decât dacă sunt verificate condicondiţţiile de iile de continuarecontinuare pentru x1,x2,…,xk.
MetodaMetoda BackTrackingBackTracking
Condiţiile de continuare sunt necesare pentru a ajunge la rezultat cu primele k alegeri făcute. Altfel spus, dacă condiţiile de continuare nu sunt îndeplinite, atunci indiferent cum am alege valori pentru următoarele componente xk+1,xk+2,…,xn, nu vom ajunge la rezultat, deci nu are sens să continuăm completarea vectorului X. Se poate observa că cu cât aceste condiţii de continuaresunt mai restrictive cu atât algoritmul va fi mai eficient, deci o bună alegere a condiţiilor de continuare va duce la reducerea numărului de căutări.
Condiţiile de continuare sunt o generalizare a condiţiilor interne pentru orice subşir x1,x2,…,xk (1 k n). Aceasta înseamnă că pentru k=n condiţiile de continuare coincid cu condiţiile interne (lucru care trebuie demonstrat teoretic). Dacă k=n şi sunt îndeplinite condiţiile de continuare se poate da ca rezultat vectorul X, pentru că au fost îndeplinite condiţiile interne (deci X este soluţie).
Dacă nu sunt îndeplinite condiţiile de continuare se alege altă valoare din mulţimea Sk, pentru componenta xk, iar dacă în mulţimea Sk nu mai sunt alte valori (pentru că mulţimile sunt finite), atunci se revine la componenta anterioară xk-1, încercând o nouă alegere (din mulţimea Sk-1 pentru componenta xk-1). Dacă s-a ajuns la x1 şi nu se mai poate executa o revenire (k=0), atunci algoritmul se termină.
MetodaMetoda BackTrackingBackTracking
Dacă dorim să completăm vectorul X începând cu prima componentă, apelul subalgoritmului Bt(X,k,n) (care completează vectorul X din poziţia k până în poziţia n) este Bt(X,1,n).
Subalgoritmul backtracking este următorul:
Subalgoritmul Subalgoritmul Bt Bt (X,(X,k,nk,n) ) esteeste::
Pentru Pentru e e Sk Execută Sk ExecutăXXkk:=e;:=e;Dacă Dacă Cond_ContCond_Cont (X,(X,kk) )
AtunciAtunciDacă Dacă k=nk=n Atunci Atunci RezultateRezultate (X,(X,nn))
{{ k<nk<n } } AltfelAltfel Bt Bt (X,(X,kk+1+1,n,n))Sf_DaSf_Dacă că
Sf_DaSf_DacăcăSf_PentruSf_Pentru
Sf Sf BtBt..
MetodaMetoda BackTrackingBackTracking
Exemple:
a) Problema Submulţimilor de sumă dată .
Fiind date numerele pozitive a1,a2,…,an se cere să se determine subşirul de sumă
dată T.
Fie xi {0, 1} astfel: 0 reprezintă faptul că ai nu intră în sumă, iar 1 în sens
contrar. Se observă că S={0,1}n este finită.
Condiţiile interne: x1*a1+x2*a2+…+xn*an = T .
Condiţiile de continuare: x1*a1+x2*a2+…+xk*ak T , şi
x1*a1+x2*a2+…+xk*ak + ak+1+ak+2+…+an T .
deci: T – (ak+1+ak+2+…+an) x1*a1+x2*a2+…+xk*ak T .
Se observă că pentru k=n Condiţiile de continuare devin Condiţii interne.
MetodaMetoda BackTrackingBackTracking
Programul Pascal este următorul:Program Bt_Subm_Suma_Data;Program Bt_Subm_Suma_Data;Const n=10; Type Const n=10; Type RezRez=Array[1..n] Of Byte;=Array[1..n] Of Byte;Const A : Array[1..n] Of Word=(10,20,30,40,50,100,150,1000,50Const A : Array[1..n] Of Word=(10,20,30,40,50,100,150,1000,5000,10000);00,10000);
T : Integer=11150;T : Integer=11150;Function Function Cc(X:Rez;k:Byte):BooleanCc(X:Rez;k:Byte):Boolean;;
Function Function SumSum ((k:Byte):Wordk:Byte):Word;;Begin If k>n Then Sum :=0 Else Sum :=Sum(k+1)+a[kBegin If k>n Then Sum :=0 Else Sum :=Sum(k+1)+a[k] End;] End;Function Function SumaSuma ((k:Byte):Wordk:Byte):Word;;Begin If k=0 Then Suma:=0 Else Suma:=Suma(kBegin If k=0 Then Suma:=0 Else Suma:=Suma(k--1)+X[k]*1)+X[k]*a[ka[k] End;] End;
BeginBeginCc:=(TCc:=(T--Sum(k+1)<=Sum(k+1)<=Suma(kSuma(k)) And ()) And (Suma(kSuma(k)<=T))<=T)
End;End;Procedure Tip(X:Rez; n:Byte);Begin If n>0 Then Begin If X[n]=1 Then Write(a[n],'+'); Tip(X,n-1) End Else Writeln(#8+' = ',T)End;Procedure Bt(X:Rez; k,n:Byte); Var v:Byte;Procedure Bt(X:Rez; k,n:Byte); Var v:Byte;BeginBegin
For v:=0 To 1 Do Begin For v:=0 To 1 Do Begin X[kX[k]:=v;]:=v;If If Cc(X,kCc(X,k) Then If k=n Then ) Then If k=n Then Tip(X,kTip(X,k) Else Bt(X,k+1,n) End) Else Bt(X,k+1,n) End
End;End;VarVar X:RezX:Rez;;BeginBegin
WritelnWriteln('*Start*'); ('*Start*'); Bt(X,1,n);Bt(X,1,n); Write('*Stop*'); Write('*Stop*'); ReadlnReadlnEnd.End.
MetodaMetoda BackTrackingBackTracking
b) Problema Repartizării Cetăţenilor într-o Sală
Aranjaţi într-o sală dreptunghiulară (mxn) k<=m*n cetăţeni din diverse ţări astfel încâttoţi vecinii ( |V|8 ) fiecăruia să provina din ţări prietene (sau concetăţeni)!
Se dau dimensiunile sălii (m,n), numărul de ţări (t), numărul de cetăţeni din fiecare ţară (f) precum şi relaţiile de prietenie dintre ţări (A).
Condiţiile interne: numărul de cetăţeni din sală pentru fiecare ţară este corect şi nici unuldintre aceştia nu se ceartă cu vecinii lui.
Condiţiile de continuare: numărul de cetăţeni din fiecare ţară precum şi numărul de locurilibere din sală este corect (fi) la fiecare aşezare şi nu se ceartă cu vecinii lui.
Programul Pascal este următorul:Program Program Bt_salaBt_sala;;Const Const L=10;L=10; Type Sir=array[0..L] Of Byte;Type Sir=array[0..L] Of Byte;
RezRez=array[0..L,0..L] Of Byte;=array[0..L,0..L] Of Byte;RelRel=array[0..L,0..L] Of Boolean;=array[0..L,0..L] Of Boolean;
Var Var M,n,t:byte; M,n,t:byte; F,s:sir; F,s:sir; A:rel; X:rez;A:rel; X:rez;
MetodaMetoda BackTrackingBackTracking
Procedure date(var m,n,t:byte; var f:sir; var a:rel);Procedure date(var m,n,t:byte; var f:sir; var a:rel);Var i,j,r:byte; pas:text; rand:string;Var i,j,r:byte; pas:text; rand:string;BeginBegin assign(pas,assign(pas,'bt'bt--sala.Passala.Pas''); ); reset(pasreset(pas););
Repeat Repeat readln(pas,randreadln(pas,rand) until rand='end.';) until rand='end.';Readln(pas,m,nReadln(pas,m,n); ); readln(pas,treadln(pas,t););For i:=1 to t do begin For i:=1 to t do begin read(pas,f[iread(pas,f[i]); inc(f[0],f[i]) end; ]); inc(f[0],f[i]) end; readln(pas,randreadln(pas,rand););
F[0]:=m*nF[0]:=m*n--f[0];f[0];For i:=0 to t+1 do begin a[i,0]:=true; a[0,i]:=true For i:=0 to t+1 do begin a[i,0]:=true; a[0,i]:=true end;end;For i:=0 to t+1 do begin x[i,0]:=0; x[0,i]:=0; x[i,t+1]:=0For i:=0 to t+1 do begin x[i,0]:=0; x[0,i]:=0; x[i,t+1]:=0 end;end;For i:=1 to t doFor i:=1 to t do
For j:=1 to i do begin For j:=1 to i do begin read(pas,rread(pas,r); ); a[i,ja[i,j]:=r=1; ]:=r=1; a[j,ia[j,i]:=r=1 end;]:=r=1 end;Close(pasClose(pas))
End;End;
Procedure Procedure rezultaterezultate; ; varvar i,j:bytei,j:byte; rasp:string[3]; const ; rasp:string[3]; const sol:bytesol:byte=0;=0;Begin inc (sol); Begin inc (sol); writelnwriteln(' (' sol.:',Solsol.:',Sol););
For i:=1 to m do beginFor i:=1 to m do beginFor j:=1 to n do write(x[i,j]:3); For j:=1 to n do write(x[i,j]:3); writelnwriteln end;end;
Readln(raspReadln(rasp); if rasp<>'' then halt); if rasp<>'' then haltEnd;End;
MetodaMetoda BackTrackingBackTracking
Function Function cccc(i,j:byte):boolean(i,j:byte):boolean; ; Var l,c,k:byte;Var l,c,k:byte;BeginBegin
For k:=0 to t do For k:=0 to t do s[ks[k]:=0;]:=0;For l:=1 to iFor l:=1 to i--1 do for c:=1 to n do 1 do for c:=1 to n do inc(s[x[l,cinc(s[x[l,c]]);]]);
For c:=1 to j do For c:=1 to j do inc(s[x[i,cinc(s[x[i,c]]);]]);K:=0;K:=0;While (k<=t) and (While (k<=t) and (s[ks[k]<=]<=f[kf[k]) do ]) do inc(kinc(k););Cc:=(k>t) and a[x[i,j],x[iCc:=(k>t) and a[x[i,j],x[i--1,j]] and a[x[i,j],x[i,j1,j]] and a[x[i,j],x[i,j--1]]1]]
And a[x[i,j],x[iAnd a[x[i,j],x[i--1,j1,j--1]] and a[x[i,j],x[i1]] and a[x[i,j],x[i--1,j+1]]1,j+1]]End;End;Procedure bt(i,j:byte);Procedure bt(i,j:byte); var v:byte;var v:byte;BeginBegin
For v:=0 to t do begin For v:=0 to t do begin x[i,jx[i,j]:=v;]:=v;If If cc(i,jcc(i,j) then if (i=m) and (j=n) then ) then if (i=m) and (j=n) then rezultaterezultate elseelse
If (j=n) then bt(i+1,1) elseIf (j=n) then bt(i+1,1) elseBt(i,j+1) endBt(i,j+1) end
End;End;BeginBegin
Date (Date (m,n,t,f,am,n,t,f,a);); writelnwriteln('*start*');('*start*');Bt (1,1);Bt (1,1); write ('*stop* '); write ('*stop* '); readlnreadln
End.End. Se observă că de fapt este o singură solu Se observă că de fapt este o singură soluţţie, restul fiind simetrice.ie, restul fiind simetrice.
3 4 m n4 t4 3 3 1 f11 10 1 10 0 1 1
Date
Rezultate
Sol.:44 3 2 13 0 2 13 2 1 1
Sol.:21 2 3 41 2 0 31 1 2 3
Sol.:33 2 1 13 0 2 14 3 2 1
Sol.:11 1 2 31 2 0 31 2 3 4
MetodaMetoda BackTrackingBackTracking
Teme:
a)a) Cum se pot aranja Cum se pot aranja kk nebuninebuni pe tabla de pe tabla de şşah astfel ah astfel îîncât să nu se atace ncât să nu se atace reciproc ?reciproc ?
c)c) Cum Cum veveţţii coloracolora nn ţţăriări cu cu mm culoriculori pentrupentru a se a se puteaputea deosebideosebi ţţărileările vecinevecine ??
b)b) AranjaAranjaţţi corect i corect nn piese de domino! piese de domino!
11.411.4 MetodaMetoda ProgramăriiProgramării_Dinamice_DinamiceAceastă metodă generală de elaborare a algoritmilor se aplică în
rezolvarea problemelor de optim pentru care soluţia este rezultatul unui şir de decizii d1,d2,...,dn. Pentru aplicarea acestei metode este necesar să fie îndeplinit principiul optimaliţii enunţat în cele ce urmează
Considerăm stările s0,s1,...,sn-1,sn, unde s0 este starea iniţială, iar sn este starea finală obţinută aplicând succesiv şirul de decizii d1,d2,...,dn (prin decizia di se trece din starea si-1 în starea si, pentru i=1,n, astfel :
dd11 dd22 ddnn--11 ddnnss00 ss11 ... ... ssnn--11 ssnn
Dacă di,di+1,...,dj (1i<jn) este un şir optim de decizii care transformăstarea si-1 în starea sj, trecând prin stările intermediare si,si+1,...,sj-1 şi dacă pentru k{i,i+1,...j-1} rezultă că di,di+1,...,dk şi dk+1,dk+2,...,dj sunt ambele şiruri optime de decizii de trecere din starea si-1 în starea sk respectiv din starea sk+1 în starea sj, atunci este satisfăcut principiulprincipiul optimalităoptimalităţţiiii.
Pentru a utiliza metoda programării dinamice, va trebui mai întâi săverificăm dacă este îndeplinit principiul optimalităţii apoi să scriem relaţiile de recurenţă după care o vom rezolva.
MetodaMetoda ProgramăriiProgramării_Dinamice_Dinamice
Fiecare decizie depinde de deciziile deja luate şi nu este unic determinată(în metoda Greedy de exemplu, era unic determinată). Dacă în relaţiile de recurenţă o decizie di depinde de deciziile d1,d2,...,di-1 atunci metoda se aplică înainte, iar dacă di depinde de deciziile di+1,di+2,...,dn atunci metoda se aplică înapoi.
Pentru că în general dintr-o stare si se poate trece în mai multe stări prin decizii optime, atunci vom reţine toate stările ce pot conduce la optim. Prin metoda înainte se vor calcula secvenţial pe niveluri toate stările ce ne pot conduce la optim plecând de la primul nivel {s0} până la ultimul nivel {sn}. Dacă aplicăm metoda înapoi, se vor calcula succesiv stările de pe nivelurile {sn},…, {s0}.
Prin metoda programării dinamice se evită repetarea calculului pentru aceleaşi date dacă formula recursivă/recurentă solicită acest lucru (metoda tabelării de evitare a recursivităţii) prin memorarea rezultatelor intermediare obţinute la fiecare nivel.
Dacă se doreşte şi şirul deciziilor luate pentru a obţine optimul, vom memora pentru fiecare stare şi decizia prin care s-a ajuns la aceasta pentru a putea reconstitui drumul invers.
MetodaMetoda ProgramăriiProgramării_Dinamice_Dinamice
Exemple:a) Produs optim de matrice.
Fiind date n matrice A1,A2,…,An de dimensiuni d1,d2,…,dn,dn+1 se cere să se calculeze produsul lor prin cât mai puţine operaţii de înmulţire.
Notăm cu ci,j (i<j) numărul minim de operaţii de înmulţire pentru AiAi+1…Aj;Se cunoaşte ci,i = 0 ;Se cere c1,n (desigur ne interesează şi asocierile necesare realizării minimului);Relaţiile de recurenţă: ci,j = min (ci,k+ck+1,j+di*dk+1*dj+1) //// (A(Aii…… AAkk))(A(Ak+1k+1……AAjj))
ik<j
Programul Pascal este următorul:Program produs_optim_de_matrici___programare_dinamica;Program produs_optim_de_matrici___programare_dinamica;VarVar d : array [1..10] of word;d : array [1..10] of word;
C : array [1..10,1..10] of word; C : array [1..10,1..10] of word; i,j,l,ni,j,l,n : word;: word;Function f (Function f (k:wordk:word) : word;) : word;BeginBegin
F:=c[i,k]+c[k+1,j]+d[i]*d[k+1]*d[j+1];F:=c[i,k]+c[k+1,j]+d[i]*d[k+1]*d[j+1];End;End;
MetodaMetoda ProgramăriiProgramării_Dinamice_Dinamice
Function min (var km:word):word; var k:integer;Function min (var km:word):word; var k:integer;Begin km:=i;Begin km:=i;
For k:=km+1 to jFor k:=km+1 to j--1 do1 doIf If f(kf(k) < ) < f(kmf(km) then km:=k; min:=) then km:=k; min:=f(kmf(km))
End;End;Procedure Procedure asoc(i,jasoc(i,j : word ); : word ); varvar k:wordk:word;;BeginBegin
If i<j then begin k:=If i<j then begin k:=c[j,ic[j,i];];Asoc(i,k); asoc(k+1,j); write (i,',',j,'; ') endAsoc(i,k); asoc(k+1,j); write (i,',',j,'; ') end
End;End;BeginBegin
Write(' nr. De Write(' nr. De matricematrice : '); : '); readlnreadln (n);(n);Write(' Write(' dimensiuniledimensiunile : '); for i:=1 to n+1 do : '); for i:=1 to n+1 do read(d[iread(d[i]); ]); readlnreadln;;For i:=1 to n do c[i,i]:=0;For i:=1 to n do c[i,i]:=0;For l:=1 to nFor l:=1 to n--1 do1 do
For i:=1 to For i:=1 to nn--ll do begin j:=do begin j:=i+li+l;;C[i,j]:=min(c[j,i]);C[i,j]:=min(c[j,i]);
End;End;WritelnWriteln (' (' nr.Min.Inmnr.Min.Inm.= ',C[1,n]);.= ',C[1,n]);Write (' Write (' asocieriasocieri : '); asoc(1,n); : '); asoc(1,n); readlnreadln
End.End.
MetodaMetoda ProgramăriiProgramării_Dinamice_Dinamice
b) Drum de lungime minimă. Fiind conoscute distanţele directe dij dintre n localităţi să se calculeze distanţeleminime dintre acestea Dij.
Notăm cu Dkij ( i,j{1,2,…,n} ) lungimea drumului minim de la i la j trecând
eventual prin localităţile intermediare (se permite tranzitul prin localităţile) 1,2,…,k ;
Se cunoaşte D0ij = dij ;
Se cere Dnij;
Relaţiile de recurenţă: Dkij = min {Dk
i-1j , Dki-1k + Dk
k-1j }. // // (Li(Li Lj) , ( LiLj) , ( Li LkLk Lj) Lj)
Programul Pascal este următorul:
Program drum_minim___programare_dinamica;Program drum_minim___programare_dinamica;
Type dist = array [1..10,1..10] of word;Type dist = array [1..10,1..10] of word;
Procedure date(var n:byte; var d:dist);Procedure date(var n:byte; var d:dist);VarVar i,j:bytei,j:byte; ; pas:textpas:text; ; rand:stringrand:string; ; v:wordv:word; const ; const inf:wordinf:word=56789;=56789;BeginBegin
Assign(pas,'pd_drmin.PasAssign(pas,'pd_drmin.Pas'); '); reset(pasreset(pas););Repeat Repeat readln(pas,randreadln(pas,rand) until rand='end.';) until rand='end.';Readln(pas,nReadln(pas,n););For i:=1 to n doFor i:=1 to n do
For j:=1 to i do begin For j:=1 to i do begin read(pas,vread(pas,v););If (v=0) and (i>j) then v:=If (v=0) and (i>j) then v:=infinf;;D[i,j]:=v; d[j,i]:=v end;D[i,j]:=v; d[j,i]:=v end;
Close(pas)Close(pas)End;End;Var d : dist; n, i,j,k : byte;Var d : dist; n, i,j,k : byte;BeginBegin
Date (Date (n,dn,d););For k:=1 to n doFor k:=1 to n do
For i:=1 to n doFor i:=1 to n doFor j:=1 to n doFor j:=1 to n do
If If d[i,k]+d[k,jd[i,k]+d[k,j]<]<d[i,jd[i,j] then ] then d[i,jd[i,j]:=]:=d[i,k]+d[k,jd[i,k]+d[k,j];];WritelnWriteln(' (' distanteledistantele minimeminime suntsunt : '); : '); writelnwriteln;;For i:=1 to n do beginFor i:=1 to n do begin
For j:=1 to i do write(d[i,j]:3); For j:=1 to i do write(d[i,j]:3); writelnwritelnEnd; End; readlnreadln
End.End.D a t eD a t eD a t e
5 n01 02 5 03 1 4 00 3 3 1 0
Date
Distanteleminime sunt :01 02 3 02 1 4 03 2 3 1 0
Rezultate
MetodaMetoda ProgramăriiProgramării_Dinamice_Dinamice
MetodaMetoda ProgramăriiProgramării_Dinamice_DinamiceTeme:
a) Care este ordinea optimă de grupare (de cost minim) a n piese de domino aşezate corect (Dri=Sti+1)? Prin gruparea a două piese vecine rezultă o singură piesă astfel: [a,b]&[b,c] [a,c] iar costul este (a,b,c). Evident sunt necesare n-1 grupări, iar costul final depinde de ordinea de grupare.
b) Care este traseul cel mai rapid de la o poartă la alta, ştiind că nu se poate pasadecât la linia următoare (de jucători) într-un timp cunoscut (dat) ?
Cum se va întinde acest cablu (de lungime minimă) plecând din camera stânga-sus până în camera dreapta-jos astfel încât numărul de clienţi care au cablu în cameră să fie maxim? Evident, se cunoaşte (se dă) numărul de clienţidin fiecare cameră.
c) Într-un hotel cu m etaje şi n camere pe fiecare etaj, se va trage (mergând orizontal sau vertical) un cablu prin camere succesive învecinate.
3 4 5 1 0 1 2 1 1 2 4 1 1 2 1 0 2 1 3 0 1 2 1 1 1 0 4 3 4 2 3 3 0 1 1 0 1 2 1 2
TemeTeme::
1. Cum pot fi aranjate 52 de piese (26 albe şi 26 negre) pe punctele aflate pe celeopt cercuri din figura alăturată astfel încât penici un cerc mare să nu fie mai mult de opt piese de aceeaşi culoare şi pe nici un cercmic să nu fie mai mult de şapte piese de aceeaşi culoare?
2. Fiind precizate două perechi de puncte (P1,Q1) si (P2,Q2), din cele 52 aflatepe cele opt cercuri din figura alăturată, să se determine două trasee care pleacă de la P1 la Q1, respectiv de la P2 la Q2, mergând doarpe arce, astfel încât acestea să nu se intersecteze.
TemeTeme::
Obs. : Obs. : MetodaMetoda de de rezolvarerezolvare esteeste la la alegerealegere ((Greedy, Greedy, Back_TrackingBack_Tracking, , ProgramareProgramareDinamicDinamicaa, etc, etc).).
3. O ploaie de meteoriţi de formă dreptunghiulară (cu laturile paralele cu axele, ca în figura 3.1) cad spre pământ (axa Ox). O parte dintre aceştia trebuie distruşi pentru a nu se suprapune în momentul atingerii solului. Care meteoriţi trebuiedistruşi astfel încât să ramâna pe sol (vezi figura 3.2) cât mai mulţi ?
Poziţia meteoriţilor este precizată prin coordonatele (pozitive) a douăpuncte diagonal opuse de forma (u1,v1); (u2,v2).
Figura 3.1 Figura 3.2
Obs.: Metoda de rezolvare este la alegere.
Exemplu :
4. Două coloane de (m respectiv n ) maşini se întâlnesc pe un drum în lucru îngustat la o distanţă egală cu lungimea unei maşini. O maşină poate înainta doar dacă are un loc liber în faţa ei, sau poate depăşi la un moment dat o singură maşinădin coloana opusă dacă există loc liber în spatele maşinii din faţă. Cum cooperează şoferii pentru a-şi putea continua drumul fară a merge su spatele.
TemeTeme::
-1--11-2--22-4--44 -3--33 333222 444111000
-1--11 111-2--22-4--44 -3--33 333222 444000
Obs. : Piesele nu pot fi scoase afară şi nici nu se pot suprapune, deci nu pot fi mutate decat în spaţiile libere ale interiorului camerei date.
Soluţia problemei va fi prezentată prin executarea fiecarei mutări.
Exemplu :
a) b) c) d)Figura 13
13. Fiind date zece piese aşezate ca în figura 13 a) se cere ca prin translaţiiorizontale sau verticale (aşa cum sunt prezentate în figura 13 b) si c) ) sa se obţinăo configuraţie de tipul celei din figura 13 d), adică cu pătratul mare langă uşă(pentru a putea fi scos afară).
TemeTeme::
. . .. . . C_C_1212 / / 2121..1212..22001212