Sunteți pe pagina 1din 17

/**Produs divizori

void afis(int x[],int k)

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

cout<<x[i]<<' ';

cout<<endl;

int posibil(int x[],int k,int n)

if(x[k-1]>=x[k] && k>1) return 0;

if(n%x[k]!=0) return 0;

return 1;

void back(int x[],int n,int k,int&ok,int prod)

for(int i=2;i<=n/2;i++)

x[k]=i;

prod=prod*x[k];

if(posibil(x,k,n))

if(prod==n)

{afis(x,k); ok=1;}

else back(x,n,k+1,ok,prod);

prod=prod/x[k];
}}

int main()

int n,x[20],ok=0;

cin>>n;

back(x,n,1,ok,1);

if(ok==0) cout<<"NU EXISTA";

return 0;

Metodele de a-l scrie pe n ca suma din intervalul [a,b];

void afis(int x[],int k)

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

g<<x[i]<<' ';

g<<endl;

int posibil(int x[],int k,int n)

if(x[k-1]>x[k] && k>1) return 0;

return 1;

void back(int x[],int n,int su,int k,int a,int b)

{
if(k<=n)

for(int i=a;i<=b;i++)

x[k]=i;

su=su+x[k];

if(posibil(x,k,n))

if(su==n)

afis(x,k);

else back(x,n,su,k+1,a,b);

su=su-x[k];

int main()

int n,a,b,x[100];

f>>n>>a>>b;

back(x,n,0,1,a,b);

Se citete un numr natural nenul n, apoi n numere naturale distincte. S se afieze, n ordine
lexicografic, irurile din cele n valori

cu proprietatea c oricare dou valori nvecinate sunt prime ntre ele.

void afis(int x[],int k,int v[])


{

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

g<<v[x[i]]<<' ';

g<<endl;

int verpri(int a,int b)

int ok=1;

if(a<b)

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

if(a%i==0 && b%i==0)

ok=0;

else

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

if(a%i==0 && b%i==0)

ok=0;

if(ok==1) return 1;

else return 0;

int posibil(int v[],int x[],int k)

for(int i=1;i<k;i++)
if(x[i]==x[k]) return 0;

if(k>1 && verpri(v[x[k]],v[x[k-1]])==0) return 0;

return 1;

void back(int x[],int v[],int n,int k)

if(k<=n)

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

x[k]=i;

if(posibil(v,x,k))

if(k==n) afis(x,k,v);

else back(x,v,n,k+1);

int main()

int n,x[20],v[20];

f>>n;

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

f>>v[i];

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

if(v[i]>v[j]) swap(v[i],v[j]);

back(x,v,n,1);

#include <iostream>

#include <fstream>

#include <string.h>

using namespace std;

ifstream f("intrare.in");

ofstream g("iesire.out");

void afis(char s[],int x[],int k)

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

g<<s[x[i]-1];

g<<endl;

int posibil(int x[],int k)

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

if(x[i]==x[k]) return 0;

return 1;

void back(char s[],int x[],int k)

{ if(k<=strlen(s))
{ for(int i=1;i<=strlen(s);i++)

{ x[k]=i;

if(posibil(x,k)==1)

if(k==strlen(s))afis(s,x,k);

else back(s,x,k+1);

int main()

char s[20];int x[20];

f>>s;

for(int i=0;i<strlen(s)-1;i++)

for(int j=i;j<=strlen(s)-1;j++)

if(s[i]>s[j])

swap(s[i],s[j]);

back(s,x,1);

Se d un numr natural n i o mulime cu m elemente, numere naturale nenule. Determinai, n ordine


lexicografic,

toate modalitile de a-l scrie pe n ca sum de termeni din acea mulime.

void afis(int x[],int v[],int k)

{
for(int i=1;i<=k;i++)

g<<v[x[i]]<<' ';

g<<endl;

int posibil(int x[],int k)

if(k>1 && x[k-1]>x[k]) return 0;

return 1;

void back(int v[],int x[],int k,int n,int m,int su)

if(k<=n)

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

x[k]=i;

su=su+v[x[k]];

if(posibil(x,k))

if(su==n)

afis(x,v,k);

else back(v,x,k+1,n,m,su);

su=su-v[x[k]];

}
}

int main()

int n,m,v[20],x[20];

f>>n>>m;

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

f>>v[i];

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

for(int j=i;j<=m;j++)

if(v[i]>v[j])

swap(v[i],v[j]);

back(v,x,1,n,m,0);

return 0;

Scriei un program care citete o valoare natural nenul impar pentru n i apoi genereaz i afieaz n
ordine cresctoare lexicografic toate combinaiile formate din n cifre care ndeplinesc urmtoarele
proprieti:

- ncep i se termin cu 0;

- modulul diferenei ntre oricare dou cifre alturate dintr-o combinaie este 1.

Astfel, pentru n=5, combinaiile afiate sunt, n ordine, urmtoarele: 01010, 01210.

#include <iostream>

#include <fstream>

#include <string.h>
#include <cmath>

using namespace std;

ifstream f("intrare.in");

ofstream g("iesire.out");

void afis(int x[],int k)

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

cout<<x[i];

cout<<endl;

int posibil(int x[],int k,int n)

if(x[1]!=0) return 0;

if(k>1 && abs(x[k-1]-x[k])!=1) return 0;

return 1;

void back(int x[],int k,int n)

if(k<=n)

for(int i=0;i<=9;i++)

x[k]=i;

if(posibil(x,k,n)==1)

if(k==n && x[k]==0)


afis(x,k);

else back(x,k+1,n);

int main()

int n,x[20];

cin>>n;

back(x,1,n);

Se d un numr natural nenul n. S se determine toate modalitile distincte de descompunere a


numrului n n sum de 3 i 5.

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("intrare.in");

ofstream g("iesire.out");

void afis(int x[],int k,int v[])

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

g<<v[x[i]]<<' ';

g<<endl;

int posibil(int x[],int k)


{

if(k>1 && x[k-1]>x[k]) return 0;

return 1;

void back(int v[],int x[],int k,int su,int n)

if(k<=n/3+1)

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

x[k]=i;

su=su+v[x[k]];

if(posibil(x,k))

if(su==n)

afis(x,k,v);

else back(v,x,k+1,su,n);

su=su-v[x[k]];

int main()

int n,x[20],v[3];
v[1]=3;

v[2]=5;

f>>n;

back(v,x,1,0,n);

return 0;

Se da un numar natural n (n<=5) si 2*n numere naturale cu cel mult 3 cifre fiecare reprezentand
inaltimile in centimetri a 2*n soldati.

Sa se aranjeze soldatii pe doua randuri a cate n soldati fiecare astfel incat fiecare soldat inafara de
primul de pe rand sa aiba in

stanga un soldat mai inalt decat el si fiecare soldat de pe randul 2 sa aiba in fata un soldat mai inalt
decat el.

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("intrare.in");

ofstream g("iesire.out");

void afisare(int v[],int n,int x[],int k)

for(int i=1;i<=n/2;i++) //randul 1

g<<v[x[i]]<<" ";

g<<endl;

for(int i=n/2+1;i<=n;i++) //randul 2

g<<v[x[i]]<<" ";

g<<endl;

g<<endl;

}
int posibil(int v[],int x[],int k,int n)

if(k!=1 && k!=n/2+1)

if(v[x[k]]>=v[x[k-1]]) return 0;

if(k>n/2)

if(v[x[k]]>=v[x[k-n/2]]) return 0;

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

if(x[i]==x[k]) return 0;

return 1;

void back(int x[],int v[],int n,int k)

if(k<=n)

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

x[k]=i;

if(posibil(v,x,k,n))

if(k==n)

afisare(v,n,x,k);

else back(x,v,n,k+1);

int main()
{

int n,v[20],x[20];

f>>n;

n=2*n;

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

f>>v[i];

back(x,v,n,1);

Se dau urmatoarele 6 culori: alb, galben, rosu, verde, albastru si negru.

Costruiti toate steagurile formate din 3 culori care indeplinesc urmatoarele conditii:

- orice steag trebuie sa contina culoarea verde sau culoarea galben la mijloc.

- culorile din fiecare steag trebuie sa fie distincte.

*/

#include <iostream>

#include <fstream>

#include <string.h>

using namespace std;

ifstream f("intrare.in");

ofstream g("iesire.out");

void citire(char a[][20],int n)

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

f.getline(a[i],20);

}
void afisare(int x[],int k,char a[][20])

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

g<<a[x[i]]<<' ';

g<<endl;

int posibil(int x[],int k,int n,char a[][20])

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

if(x[i]==x[k]) return 0;

if(x[2]==1 || x[2]==3 || x[2]==5 || x[2]==6) return 0;

return 1;

void back(int x[],char a[][20],int n,int k)

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

x[k]=i;

if(posibil(x,k,n,a))

if(k==3)

afisare(x,k,a);

else back(x,a,n,k+1);

}
}

int main()

char a[100][20];int n,x[20];

f>>n;f.get();

citire(a,n);

back(x,a,n,1);

S-ar putea să vă placă și