Professional Documents
Culture Documents
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];
int main()
{
int x[100],n,m;
fin>>n>>m;
back(x,n,m,1);
fin.close();
fout.close();
return 0;
}
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;
}