Documente Academic
Documente Profesional
Documente Cultură
1. Modificaţi algoritmul de mai sus astfel încât să obţineţi toate elementele produsului cartezian A 1, A2,..., An
unde A i={ 1, 2, ....,n i}.
Indicaţie: Numărul de elemente ale fiecărei mulţimi Ai va fi memorat într-un vector m, cu
lungimea logică n, unde m[i]=ni;
2. Scrieţi programul care generează toate “cuvintele” cu patru litere care au prima şi ultima literă vocale, litera a
doua consoană din mulţimea {P,R,S,T}, iar a treia literă consoană din mulţimea { B, M, R, T, V}
Exerciţiu: Generaţi primele 16 soluţii ale acestui produs cartezian. Ce urmează după
soluţiile:IRRU,ESTO;UTVU;OPMU ?
3. Într-un restaurant, un meniu este format din trei feluri de mâncare. Există patru preparate culinare pentru
felul unu , cinci preparate culinare pentru felul doi şi trei preparate culinare pentru felul trei. Să se genereze
toate meniurile care se pot forma cu aceste preparate culinare.
1
FIŞĂ DE LUCRU –CLASA A XI-A
METODA DE PROGRAMARE BACKTRAKING
Produs cartezian, permutări, aranjamente, combinări, submulţimi
2
FIŞĂ DE LUCRU –CLASA A XI-A
METODA DE PROGRAMARE BACKTRAKING
Produs cartezian, permutări, aranjamente, combinări, submulţimi
int valid( )
{ if ( k>1 && abs(st[k] – st[k-1]) = =1) return 0;
for( i=1; i<k; i++)
if (st[k] = =st[i]) return 0;
return 1;}
Aplicaţii:
1. Să se genereze toate permutările mulţimii A={ 1, 2, ...., n} , în care două numere vecine
nu trebuie să fie ambele pare sau ambele impare.
3
FIŞĂ DE LUCRU –CLASA A XI-A
METODA DE PROGRAMARE BACKTRAKING
Produs cartezian, permutări, aranjamente, combinări, submulţimi
2. Să se genereze toate permutările unei mulţimi de numere oarecare , astfel încât cea mai
mică şi cea mai mare valoare să-şi păstreze poziţiile iniţiale.
void tipar ( )
#include<iostream> { for( i=1; i<=m; i++)
using namespace std; cout<<st[i]<<” “;
int n,st[100],i; cout<<endl;}
void init( ) void back( )
{ st[k]=0;} { int as, ev;
int succesor( ) k=1; init( );
while ( k>0)
{ if (st[k]<n) { st[k]++; return 1;}
{ as=1; ev=0;
else return 0;} while (as && ! ev)
int valid( ) // modificare { as= succesor();
{ for( i=1; i<k; i++) if (as) ev = valid( );}
if (st[k] = =st[i]) return 0; if(as) if (solutie( )) tipar( );
return 1;} else {k++; init( );}
int solutie( ) // modificare else k --;} }
{ return k==m;} int main( )
{ cin >>n >>m;
back( ) ;}
Un exemplu de aplicare: Să se genereze toate drapelele cu trei culori care se pot forma cu şase
culori: alb,galben, roşu, verde, albastru şi negru- care au în mijloc culoarea alb, verde sau roşu.
Indicaţie : Soluţia are 3 elemente, un elemente al soluţiei fiind indicele din vector al unei culori.
Se generează aranjamente cu condiţia de 6 obiecte luate câte 3- soluţia conţine o condiţie internă
suplimentară faţă de cea impusă de aranjamente: elementul 2 al soluţiei să fie indicele culorii alb,
verde sau roşu.
int valid(
{ if (k==2 && (st[k]== 2 || st[k] == 5 || st[k]= =6 )) return 0; Atenţie: mai sunt şi alte
for( i=1; i<k; i++) modificări de făcut în
if (st[k] = =st[i]) return 0; algoritm!!!!!!!!!!!!!
return 1;}
Aplicaţii:
1. Se citesc de la tastatură n cifre distincte. Să se genereze toate numerele de m cifre
( m<=n) care se pot forma cu aceste cifre şi care conţin toate cele n cifre.
4
FIŞĂ DE LUCRU –CLASA A XI-A
METODA DE PROGRAMARE BACKTRAKING
Produs cartezian, permutări, aranjamente, combinări, submulţimi
2. Să se genereze toate anagramele unui cuvânt , din care se elimină p litere oarecare .
Valoarea minimă a numărului p este 1, iar valoarea maximă este cu 1 mai mică decât
lungimea cuvântului. Se citesc de la tastatură literele cuvântului şi valoarea numărului p.
Aplicaţii:
1. Să se genereze toate grupurile de p persoane, care se pot forma din n persoane.
Informaţiile se citesc dintr-un fişier text unde, pe primul rând, sunt scrise valorile pentru p
5
FIŞĂ DE LUCRU –CLASA A XI-A
METODA DE PROGRAMARE BACKTRAKING
Produs cartezian, permutări, aranjamente, combinări, submulţimi
6
FIŞĂ DE LUCRU –CLASA A XI-A
METODA DE PROGRAMARE BACKTRAKING
Produs cartezian, permutări, aranjamente, combinări, submulţimi
return 1;}
Aplicaţii:
1. Se citesc numele a 6 elevi. Afişaţi toate submulţimile celor 6 elevi.
2. Să se afişeze toate numerele scrise în baza 10 a căror reprezentare în baza 2 are n cifre,
dintre care exact k sunt egale cu 1. Valorile n şi k se citesc de la tastatură( n<12, k<n).
De exemplu, pentru n=3 şi k=2, se obţin valorile: 5 şi 6.
7
FIŞĂ DE LUCRU –CLASA A XI-A
METODA DE PROGRAMARE BACKTRAKING
Produs cartezian, permutări, aranjamente, combinări, submulţimi
#include <iostream>
using namespace std;
int n,st[100],k,i;
void init(int k )
{ st[k]=0;}
int valid(int k )
{ return 1;}
void back(int k )
{ if(solutie(k))tipar(k);
else
{ init(k);
while(successor(k))
if(valid(k))
back(k+1);}
}
int main()
{ cin>>n;
bak(1);
return 0; }