Sunteți pe pagina 1din 4

Fie n>0, natural.

Sa se scrie un program care sa afiseze toate partitiile unui


numar natural n.
Numim partitie a unui numar natural nenul n o multime de numere naturale
nenule {p1, p2, , pk} care ndeplinesc conditia p1+p2+ +pk = n.
Ex: pt n = 4 programul va afisa:
4 = 1+1+1+1
4 = 1+1+2
4 = 1+3
4 = 2+2
4 = 4
#include<iostream>
using namespace std;
int n, ns,sol[20];

void afis(int l)
{ int i;
ns++;
cout<<"Solutia nr.: "<< ns<<" : ";
for(i=1;i<=l;i++) cout<<sol[i]<<" ";
cout<<endl;
}

void back(int i, int sp)
{ int j;
if (sp==n) afis(i-1);
else for(j=1;j<=n-sp;j++)
if (j>=sol[i-1])
{
sol[i]=j;
back(i+1, sp+j);
}
}

void main()
{
cout<<"Dati n:";
cin>>n;
ns=0;
back(1,0);
cout<<"S-au gasit "<<ns<<" solutii."<<endl;
}
Sa se scrie un program care genereaza si scrie ntr-un fisier toate cuvintele
formate din n vocale mici (n numar natural citit de la tastatura, n<10), ordonate
alfabetic. De exemplu, pentru n=3 se vor scrie n fisier:
aaa
aae
aai
aao
aau
aea
.....
uuo
uuu

#include<iostream>
using namespace std;
int x[10],n;
char v[]="aeiou";

void scriesol()
{ int j;
cout<<endl;
for(j=1;j<=n;j++) cout<<v[x[j]];
}
void back(int k)
{ int i;
for(i=0;i<=4;i++)
{ x[k]=i;
if (k==n) scriesol();
else back(k+1);
}}
void main()
{ cout<<"n: ";
cin>>n;
back(1);
cout<<endl;}

Se citeste un numar natural n (cel mult 4). Afisati toate matricile n*n care
contin elementele distincte de la 1 la n*n si in care orice element are paritate
diferita de orice vecin al sau (vecinii se considera pe linie si pe coloana).
Exemplu:
1 2 3 4
6 5 8 7
9 10 11 14
12 13 16 15
#include<fstream>
#include<cstring>
Using namespace std;
using namespace std;
ifstream f("date.in");
ofstream g("date.out");
int n,p[100],a[10][10];
void afis()
{ int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
g<<a[i][j]<<" ";
g<<endl;}
g<<endl;
}
int bun(int i, int j)
{ if(i>1) if(a[i-1][j]%2==a[i][j]%2) return 0;
if(j>1) if(a[i][j-1]%2==a[i][j]%2) return 0;
return 1;
}
void back(int i, int j)
{ for(int v=1;v<=n*n;v++)
if(!p[v])
{ a[i][j]=v;
p[v]=1;
if(bun(i,j)) if(i==n&&j==n) afis();
else if(j<n) back(i,j+1);
else back(i+1,1);
p[v]=0;
}
}
int main()
{
f>>n;
back(1,1);
return 0;
}
La curtea regelui Arthur s-au adunat n cavaleri numerotati de la 1 la n.
Despre ei se cunosc relatii de dusmanie de forma (x,y) cu semnificati ca x si y se
dusmanesc.
Afisati toate modurile in care Arthur ii poate aranja la o masa rotunda cu n
scaune astfel incat sa nu stea unul langa altul 2 cavaleri care dusmanesc.
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int a[50][50],x[50],p[50],n;
void citire()
{
int i,j;
fin>>n;
while(fin>>i>>j) a[i][j]=a[j][i]=1;

}
void afis()
{
int i;
for(i=1;i<=n;i++) fout<<x[i]<<" ";
fout<<endl;
}
int bun(int k)
{
if(k>1) if(a[x[k]][x[k-1]]==1) return 0;
if(k==n) if(a[x[1]][x[n]]==1) return 0;
return 1;
}
void back(int k)
{
for(int i=1;i<=n;i++)
if(!p[i])
{
x[k]=i; p[i]=1;
if(bun(k)) if(k==n) afis();
else back(k+1);
p[i]=0;
}
}
int main()
{
citire();
back(1);
fin.close();
fout.close();
return 0;}

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