You are on page 1of 12

PERMUTARI RECURSIV

#include <iostream>

using namespace std;


int st[100],n,x=0;
int valid(int k)
{int i;

for (i=1;i<k;i++)
if(st[k]==st[i])return 0;
return 1;
}
void tipar()
{
x++; cout<<x<<".";
for(int i=1; i<=n; i++)
cout<<st[i]<<" ";
cout<<endl;
}

void back(int k)
{

for(int i=1; i<=n; i++)


{
st[k]=i;
if(valid(k))
if(k==n) tipar();
else back(k+1);
}
}
int main()
{
cin>>n;
back(1);
}

1.Sa se genereze si sa numere toate permutarile multimii {1,2,3,...,n} care incep cu valoarea 1.

#include <iostream>

using namespace std;


int st[100],n,x=0;
int valid(int k)
{int i;

for (i=1;i<k;i++)
if(st[k]==st[i])return 0;
return 1;
}
void tipar()
{
x++; cout<<x<<".";
for(int i=1; i<=n; i++)
cout<<st[i]<<" ";
cout<<endl;
}

void back(int k)
{

for(int i=1; i<=n; i++)


{
st[k]=i;
if(valid(k))
if(k==n) tipar();
else back(k+1);
}
}
int main()
{
cin>>n;
st[1]=1;
back(2);
}

2.Permutari paritate diferita


Sa se genereze si sa numere toate permutarile multimii {1,2,3,...,n} in care elementele au paritate
diferita

#include <iostream>

using namespace std;


int st[100],n,x=0;
int valid(int k)
{int i;

for (i=1;i<k;i++)
if(st[k]==st[i] || (st[k-1]%2==st[k]%2)) return 0;
return 1;
}
void tipar()
{
x++; cout<<x<<".";
for(int i=1; i<=n; i++)
cout<<st[i]<<" ";
cout<<endl;
}

void back(int k)
{

for(int i=1; i<=n; i++)


{
st[k]=i;
if(valid(k))
if(k==n) tipar();
else back(k+1);
}
}
int main()
{
cin>>n;
back(1);
}

3.PERMUTARI RECURSIVE CARTI IN FISIER


Se citesc din fisierul carti.in n carti.
-Determinati toate permutarile celor n carti.
-Determinati toate permutarile celor n carti astfel incat primele doua sa nu fie alaturate.
// se adauga conditia de validare || (st[i]==1 && st[k]==2)

#include <iostream>
#include<fstream>
using namespace std;
ifstream f("carti.in");
ofstream g ("carti.out");
int st[30],n,x=0;
char c[30][50];
int valid(int k)
{int i;

for (i=1;i<k;i++)
if(st[k]==st[i])return 0;
return 1;
}
int solutie(int k)
{
return k==n;
}
void tipar()
{
x++; g<<x<<".";
for(int i=1; i<=n; i++)
g<<c[st[i]]<<"\t ";
g<<endl;
}

void back(int k)
{

for(int i=1; i<=n; i++)


{
st[k]=i;
if(valid(k))
if(solutie(k)) tipar();
else back(k+1);
}
}
int main()
{
f>>n;f.get();
for (int i=1;i<=n;i++)
f.getline(c[i],50);
back(1);
}

4.ANAGRAME

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");

int n,x=0,st[50];
int valid(int k)
{
for(int i=1;i<k;i++)
if(st[k]==st[i] || (st[i]==1 && st[k]==5))
return 0;
return 1;
}
void tipar()
{x++;
cout<<endl;
cout<<x<<")";
for(int i=1;i<=n;i++)
{if(st[i]==1) cout<<"A"<<' ';
if(st[i]==2) cout<<"C"<<' ';
if(st[i]==3) cout<<"E"<<' ';
if(st[i]==4) cout<<"R"<<' ';
if(st[i]==5) cout<<"T"<<' ';}}
void bt(int k)
{int i;
for(int i=1;i<=n;i++)
{ st[k]=i;
if(valid(k))
if(k==n) tipar();
else bt(k+1); }}
int main()
{int i;
f>>n;
bt(1);
return 0;
}

ANAGRAME 2

Se citeste un cuvant format din maxim 10 litere mici distincte. Afisati in ordine lexicografica toate
anagramele cuvantului citit care au proprietatea ca nu contin doua vocale alaturate si nici doua
consoane alaturate (practic vocalele si consoanele trebuie sa alterneze).

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,X[12],P[12];
char s[12];

void afisare()
{
for(int i=1;i<=n;i++)
cout<<s[X[i]-1];
cout<<endl;
}

int valid(int k)
{
if(k>1) //daca sunt cel putin la cea de-a doua litera
{
if(strchr("aeiou",s[X[k]-1])==0 &&
strchr("aeiou",s[X[k-1]-1])==0)
return 0; //doua consoane alaturare => 0
if(strchr("aeiou",s[X[k]-1])!=0 &&
strchr("aeiou",s[X[k-1]-1])!=0)
return 0; //doua vocale alaturate => 0
}
return 1;
}

void back(int k)
{
for(int i=1;i<=n;i++)
if(!P[i])
{
P[i]=1;
X[k]=i;
if(valid(k))
if(k==n) afisare();
else back(k+1);
P[i]=0;
}
}

void ordonare(char s[])


{
int l=strlen(s);
for(int i=0;i<l;i++)
for(int j=i+1;j<l;j++)
if(s[i]>s[j])
{
char aux=s[i];
s[i]=s[j];
s[j]=aux;
}
}

int main()
{
cin>>s;
n=strlen(s);
int cv=0,cc=0;
for(int i=0;i<n;i++)
if(strchr("aeiou",s[i])==0) cc++;//numaram consoanele
else cv++;//numaram vocalele
if(abs(cc-cv)>1) cout<<"IMPOSIBIL";//diferenta>1 => imposibil
else
{
ordonare(s);//ordonez alfabetic cuvantul
back(1);
}
return 0;
}

5.Permutari PRAJITURI pere mure afine fragi zmeura. Mure si afine sa nu fie consecutive

#include <iostream>

using namespace std;


int st[100],n,x=0,i;
int valid(int k)
{int i;

for (i=1;i<k;i++)
if(st[k]==st[i] || (st[i]==2 && st[k]==3) )
return 0;
return 1;
}
void tipar()
{
for(i=1;i<=n;i++)
if(st[i]==1) cout<<" pere ";
else if(st[i]==2) cout<<" mure ";
else if(st[i]==3) cout<<" afine ";
else if(st[i]==4) cout<<" fragi ";
else if(st[i]==5) cout<<" zmeura ";
cout<<endl;
}

void back(int k)
{

for(int i=1; i<=n; i++)


{
st[k]=i;
if(valid(k))
if(k==5) tipar();
else back(k+1);
}
}
int main()
{
n=5;
back(1);
}

Suplimentar

Se citeste un numar natural n (n<10) si apoi o multime A cu n elemente naturale ordonate crescator.
Afisati in ordine lexicografica toate permutarile multimii A in care elementele pare sunt puncte fixe.
Exemplu: n=5 si A={1,4,6,7,9} => se vor genera permutarile in care 4 si 6 nu isi modifica pozitia (6 solutii).
#include <fstream>
using namespace std;
ifstream fin("p1.in");
ofstream fout("p1.out");

int A[11],P[11],X[11],n;

void afis()
{
for(int i=1;i<=n;i++)
fout<<A[X[i]]<<" ";
fout<<endl;
}

void back(int k)
{
for(int i=1;i<=n;i++)
if(!P[i])
{
P[i]=1;
X[k]=i;
if(A[i]%2!=0 || X[k]==k) //impar sau punct fix
if(k==n) afis();
else back(k+1);
P[i]=0;
}
}

int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>A[i];

back(1);
return 0;
}

LITERE A SI M

3.Litere A,M
#include <iostream>
using namespace std;
int st[100],n,x=0;
void tipar()
{
x++; cout<<x<<".";
for(int i=1; i<=n; i++)
if(st[i]==1) cout<<"A ";
else cout<<"M ";
cout<<endl;
}
void back(int k)
{

for(int i=1; i<=2; i++)


{
st[k]=i;
if(k==n) tipar();
else back(k+1);
}
}
int main()
{
cin>>n;
back(1);
}

Se citeste un numar natural n. Generati si afisati toate combinatiile de cate n cifre binare care nu
au doua cifre de 1 alaturate.
Exemplu:
n=3
combinatiile sunt:
000
001
010
100
101

#include <fstream>
using namespace std;
ifstream is("date.in");
ofstream os("date.out");

int x[15],n;

void afis()
{
for(int i=1;i<=n;i++)
os<<x[i]<<" ";
os<<endl;
}

void back01(int k)
{
for(int i=0;i<=1;i++)
{
x[k]=i;
if(k>1) if(x[k]*x[k-1]!=1)
if(k==n) afis();
else back01(k+1);
else ;
else back01(k+1);
}
}

int main()
{
is>>n;
back01(1);
is.close();
os.close();
return 0;
}

Se citeste un numar natural n. Afisati permutarile multimii 1,2,3...n in care pana la jumatate elementele
sunt in ordine descrescatoare, iar de la jumatate pana la final in ordine crescatoare.

#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

int n, sol[20], p[20];

void afis()
{
for(int i=1;i<=n;i++)
fout<<sol[i]<<" ";
fout<<endl;
}

int valid(int k)
{
if(k>1)
if(k<=(n+1)/2) { if(sol[k]>sol[k-1]) return 0; }
else if(sol[k]<sol[k-1]) return 0;
return 1;
}

void back(int k)
{
for(int i=1;i<=n;i++)
if(p[i]==0)
{
sol[k]=i;
p[i]=1;
if(valid(k)) if(k==n) afis();
else back(k+1);
p[i]=0;
}
}

int main()
{
fin>>n;
back(1);
fin.close();
fout.close();
}

Pe n scaune sunt aranjate n persoane intr-o ordine precizata. Sa se rearanjeze in toate modurile cele n
persoane pe cele n scaune tinand cont de urmatoarele doua conditii:
- doua persoane alaturate trebuie sa nu fi fost alaturate in aranjarea initiala
- fiecare persoana trebuie sa stea pe un scaun diferit de cel pe care a stat initial

#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int x[100], pus[100], n, poz[100], a[100][100];

void Write()
{ for(int i=1;i<=n;i++) fout<<x[i]<<" ";
fout<<endl;
}

int bun(int k)
{
if(x[k]==poz[k]) return 0;
if(k>1)
if(a[x[k-1]][x[k]]==1) return 0;
return 1;
}

void Perm(int k)
{ for(int i=1;i<=n;i++)
if(!pus[i])
{ x[k]=i;
pus[i]=1;
if (bun(k)) if(k==n) Write();
else Perm(k+1);
pus[i]=0;
}
}

int main()
{ fin>>n;
for(int i=1;i<=n;i++)
{
fin>>poz[i];
if(i>1)
{
a[poz[i-1]][poz[i]]=1;
a[poz[i]][poz[i-1]]=1;
}
}
Perm(1);
fin.close();
fout.close();
return 0;
}

You might also like