You are on page 1of 4

1.

Un student are de dat n examene numerotate de la 1 la n într-o sesiune formată din m zile (m
este cel puțin de 2 ori mai mare decât n).
Afișați toate modurile în care iși poate programa studentul examenele astfel încât să nu dea 2
examene în zile consecutive și să dea examenele în ordinea de la 1 la n.
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

int p[100];

void afis(int x[], int n, int m)


{
for(int i=1;i<=m;i++) fout<<x[i];
fout<<endl;

int bun(int x[], int k, int n, int m)


{
if(k>1)
{
if(x[k-1]*x[k]!=0) return 0;//2 examene alaturate
if(x[k]>1)//vreau sa pun examen
{ //caut examen cu 1 mai mic
for(int i=1;i<k;i++) if(x[i]==x[k]-1) return 1;
return 0;
}
}
if(x[1]>1) return 0;//nu pot incepe cu >1
if(x[k]==0)//vreau sa pun zi libera
{
int s=0;
for(int i=1;i<=k;i++) if(x[i]==0) s++;
if(s>m-n) return 0;//nu pot fi mai multi de 0 de m-n
}
return 1;
}

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


{
int i;
for(i=0;i<=n;i++)
if(!p[i]||i==0) //examenele nu se repeta
{
x[k]=i;
p[i]=1;
if(bun(x,k,n,m)) if (k==m) afis(x,n,m);
else back(x,n,m,k+1);
p[i]=0;
}

int main()
{
int x[100],n,m;
fin>>n>>m;
back(x,n,m,1);
fin.close();
fout.close();
return 0;
}

2. Din fișierul cub.in se citesc de pe prima linie 2 numere naturale n și m și de pe următoarele n


linii n perechi l și c unde l este lungimea laturii, iar c culoarea pentru fiecare dintre cele n cuburi.
Variabila l este număr natural, iar c este șir de caractere de lungime maximum 20. Să se
construiască toate turnurile formate din cel puțin m cuburi care se pot alcătui din cuburile citite
din fișier știind că un cub se poate așeza peste un altul doar dacă are latura strict mai mică și
culoarea diferită de a celui peste care vrem să îl punem. Să se afișeze turnurile obtinute și turnul
format din cele mai multe cuburi. Un turn se afisează începând cu cel mai de sus cub.
#include<fstream.h>
#include<string.h>

struct cub{
int l;
char c[20];
};
cub c[100];

int x[100],mx[100],max=0,n,m;
ifstream f("cub.in");

void citire()
{ int i;
f>>n>>m;
for(i=1;i<=n;i++) f>>c[i].l>>c[i].c;
}

void scriesol(int k)
{ int j;
if(k>max) { max=k;
for(j=1;j<=max;j++) mx[j]=x[j];
}
for(j=k;j>=1;j--)
cout<<c[x[j]].l<<" "<<c[x[j]].c<<endl;
cout<<endl;
}

int cond(int k)
{
if(k>1)
if(c[x[k-1]].l>c[x[k]].l)
if(strcmp(c[x[k-1]].c,c[x[k]].c)!=0) return 1;
else return 0;
else return 0;
else return 1;
}

void back(int k)
{
int i;
for(i=1;i<=n;i++)
{
x[k]=i;
if (cond(k))
{ if (k>=m) scriesol(k);
back(k+1);
}
}
}

void main()
{
citire();
back(1);
cout<<"Cel mai inalt turn:";
for(int j=max;j>=1;j--)
cout<<c[mx[j]].l<<" "<<c[mx[j]].c<<endl;
}

3. Generarea numerelor binare. Să se genereze toate numere binare de n cifre care să aibă n-m
cifre de "0" și m (m<=n) cifre de "1".
Rezolvare:
#include<iostream.h>
int st[20],k,p,as,ev;
void init(int k,int st[ ])
{
st[k]=-1;
}
int succesor(int k,int st[ ])
{
if ( st[k]<1 && k<=n )
{
st[k]=st[k]+1;
as=1;
}
else as=0;
return as;
}
int valid(int k,int st[ ])
{
int i,j=0;
ev=1;
if(k>2)
{
for(i=1;i<=k-1;i++)
if(st[i]==0) j++;
if((st[k]==0) && (j==p)) ev=0;
}
return ev;
}

int solutie(int k)
{
int j=0,i;
for(i=1;i<=k;i++)
if(st[i]==0) j++;
if((k==n) && (j==p)) return 1;
else return 0;
}

void tipar(void)
{
int i;
for (i=1;i<=n;i++)
cout<<st[i]<<" ";
cout<<"\n";
}

int main(void)
{
int a=0; // in a numar cate solutii sunt
cin>>n>>m;
p=n-m;
k=1; init(k,st);
while (k>0)
{
do{
as=succesor(k,st);
if (as) ev=valid(k,st);
}while (!( !as || (as && ev)));
if (as)
if (solutie(k)){ a++; tipar(); }
else
{
k++; init(k,st);
}
else k--;
}
}
Forma recursivă
#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(suma(k))<=m)
if(k==n) afis();
else back01(k+1);
else ;
else back01(k+1);
}
}

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

You might also like