Info 1
Info 1
Info 1
Cerinţa
Se citeşte un număr natural nenul n. Să se afişeze, în ordine lexicografică, permutările
mulţimii {1,2,..,n}.
Date de intrare
Fişierul de intrare permutari.in conţine pe prima linie numărul n.
Date de ieşire
Fişierul de ieşire permutari.out va conţine pe fiecare linie elementele unei permutări,
separate prin câte un spaţiu.
Restricţii şi precizări
• 0<n<9
#include<fstream>
using namespace std;
ifstream f("permutari.in");
ofstream g("permutari.out");
int x[10],n;
int Solutie(int k){
if(k==n)
return 1;
else return 0;
}
int Ok (int k)
{
for (int i=1; i<k; i++)
if (x[k]==x[i]) return 0;
return 1;
}
void Afisare (int k)
{
for(int i=1;i<=k;i++)
g<<x[i]<<" ";
g<<endl;
}
void Back(int k) {
for( int i=1;i<=n;i++)
{
x[k]=i;
if(Ok(k))
if(Solutie(k))
Afisare(k);
else Back(k+1);
}
}
int main()
{
f>>n;
Back(1);
return 0;
}
#124Permutari1
Cerinţa
Se citeşte un număr natural nenul n. Să se afişeze, în ordine invers lexicografică,
permutările mulţimii {1,2,..,n}.
Date de intrare
Fişierul de intrare permutari1.in conţine pe prima linie numărul n.
Date de ieşire
Fişierul de ieşire permutari1.out va conţine pe fiecare linie elementele unei permutări,
separate prin câte un spaţiu.
Restricţii şi precizări
• 0<n<9
#include <fstream>
using namespace std;
ifstream f("permutari1.in");
ofstream g("permutari1.out");
int x[10],n;
int Solutie(int k)
{if(k==n)
return 1;
else
return 0;
}
int OK(int k)
{for(int i=1; i<k; i++)
if(x[k]==x[i])
return 0;
return 1;
}
void Afisare(int k)
{ for(int i=1; i<=k; i++)
g<<x[i]<<" ";
g<<endl;}
void Back(int k)
{ for(int i = n ; i >= 1 ; i--)
{ x[k]=i;
if( OK(k) )
if(Solutie(k))
Afisare(k);
else
Back(k+1); }
}
int main()
{ f>>n;
Back(1);
return 0;
}
#125Permutari2
Cerinţa
Se citeşte un număr natural nenul n, apoi n numere naturale distincte. Să se afişeze, în
ordine lexicografică, permutările mulţimii formate din cele n numere citite.
Date de intrare
Fişierul de intrare permutari2.in conţine pe prima linie numărul n, ia r pe a doua
linie n numere naturale.
Date de ieşire
Fişierul de ieşire permutari2.out va conţine pe fiecare linie elementele unei permutări,
separate prin câte un spaţiu.
Restricţii şi precizări
• 0<n<9
• cele n numere de pe a doua linie a fişierului de intrare sunt mai mici decât 100
#include <fstream>
using namespace std;
ifstream f("permutari2.in");
ofstream g("permutari2.out");
int x[10],n,v[10],aux;
int Solutie(int k)
{ if(k==n)
return 1;
else return 0;}
int OK(int k)
{ for(int i=1; i<k; i++)
if(x[k]==x[i])
return 0;
return 1;}
void Afisare(int k)
{ for(int i=1; i<=k; i++)
g<<v[x[i]]<<" ";
g<<endl;}
void Back(int k)
{ for(int i = 1 ; i <= n ; i++)
{x[k]=i;
if( OK(k) )
if(Solutie(k))
Afisare(k);
else
Back(k+1); } }
int main()
{f>>n;
for(int i=1; i<=n; i++)
f>>v[i];
for(int i=1; i<n; i++)
for(int j=i+1; j<=n; j++)
if(v[i]>v[j])
{ aux= v[i];
v[i]=v[j];
v[j]=aux;}
Back(1);
return 0; }
#202PermPF
Fie mulţimea M={1,2,..,n} şi P(1),P(2),...,P(n) o permutare a ei. Elementul x din M se
numeşte punct fix dacă P(x)=x.
Cerinţa
Se citeşte un număr natural nenul n. Să se afişeze, în ordine lexicografică, permutările
fără puncte fixe ale mulţimii {1,2,..,n}.
Date de intrare
Fişierul de intrare permpf.in conţine pe prima linie numărul n.
Date de ieşire
Fişierul de ieşire permpf.out va conţine pe fiecare linie elementele unei permutări,
separate prin câte un spaţiu.
Restricţii şi precizări
• 0<n<9
#include <fstream>
using namespace std;
ifstream f ("permpf.in");
ofstream g ("permpf.out");
int x[10], n,v[10];
int
Solutie (int k)
{if (k == n)
return 1;
else
return 0;
}
int
OK (int k)
{ for (int i = 1; i < k; i++)
if (x[k] == x[i])
return 0;
if(x[k]==k)
return 0;
return 1;
}
void Afisare (int k)
{for (int i = 1; i <= k; i++)
g << x[i] << " ";
g << endl;
}
void Back (int k)
{ for (int i = 1; i <= n; i++)
{ x[k] = i;
if (OK (k))
if (Solutie (k))
Afisare (k);
else
Back (k + 1);
} } int main ()
{f >> n;
Back (1);
return 0;}
#1281Regine1
Cerința
Se consideră o tablă de șah de dimensiune n. Să se plaseze pe tablă n regine astfel
încât să nu existe două regine care să se atace.
Date de intrare
Programul citește de la tastatură numărul n.
Date de ieșire
Programul va afișa pe ecran o singură configurație validă a tablei de șah. Ea va fi
alcătuită din n linii cu câte n caractere - sau *, separate prin câte un spațiu.
Caracterul - reprezintă o poziție liberă de pe tablă, iar caracterul * reprezintă o poziție de
pe tablă ocupată de o regină.
Restricții și precizări
• 4 ≤ n ≤ 10;
• două regine se atacă dacă se află pe aceeași linie, aceeași coloană sau aceeași
diagonală;
• orice configurație validă a tablei este acceptată.
#include <iostream>
#include <cmath>
using namespace std;
int x[10],n, ns, abs();
int Solutie(int k)
{if(k==n)
return 1;
else
return 0;}
int OK(int k)
{for(int i=1; i<k; i++)
if(x[i]==x[k]||(abs(x[i]-x[k])==k-i))
return 0;
return 1;
} void Afisare(int k)
{ for(int i=1; i<=k; i++)
{for(int j=1; j<=n; j++)
if(x[i]==j)
cout<<"*";
else cout<<"-";
cout<<endl;
}}
void Back(int k)
{for(int i = 1 ; i <= n ; i++)
{ x[k]=i;
if( OK(k) )
if(Solutie(k))
{ ns++;
if(ns==1)
Afisare(k); }
else Back(k+1); }
} int main()
{cin>>n;
ns=0;
Back(1);
return 0;}
#1327SirPIE
Cerinţa
Se citeşte un număr natural nenul n, apoi n numere naturale distincte. Să se afişeze, în
ordine lexicografică, șirurile din cele n valori cu proprietatea că oricare două valori
învecinate sunt prime între ele.
Date de intrare
Fişierul de intrare sirpie.in conţine pe prima linie numărul n, iar pe a doua linie n numere
naturale.
Date de ieşire
Fişierul de ieşire sirpie.out va conţine pe fiecare linie elementele unei șir, separate prin
câte un spaţiu.
Restricţii şi precizări
• 1 ≤ n < 10
• cele n numere de pe a doua linie a fişierului de intrare sunt mai mici decât 10000
#include <fstream>
using namespace std;
ifstream f ("sirpie.in");
ofstream g ("sirpie.out");
int x[10], n,v[10];
int
Solutie (int k)
{
if (k == n)
return 1;
else
return 0;
}
int cmmdc(int a, int b)
{
int r;
r=a%b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int
OK (int k)
{
for (int i = 1; i < k; i++)
if (x[k] == x[i])
return 0;
if(k>1)
if(cmmdc(v[x[k-1]],v[x[k]])!=1)
return 0;
return 1;
}
void Afisare (int k)
{
for (int i = 1; i <= k; i++)
g << v[x[i]] << " ";
g << endl;
}
void Back (int k)
{for (int i = 1; i <= n; i++)
{ x[k] = i;
if (OK (k))
if (Solutie (k))
Afisare (k);
else Back (k + 1);
}}
int main ()
{
int i,j,aux;
f >> n;
for(i=1; i<=n; i++)
f>>v[i];
for(i=1; i<n; i++)
for(j=i+1; j<=n; j++)
if(v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=aux; }
Back (1);
return 0;}
#3161permutari5
Cerința
Se citește o multime cu n numere naturale. Afișați în ordine lexicografică toate
permutările mulțimii citite în care elementul minim nu își schimbă poziția.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale distincte,
separate prin spații.
Date de ieșire
Programul va afișa pe ecran permutările cerute, pe rânduri separate, fiecare permutare
având elementele separate prin câte un spațiu.
Restricții și precizări
• 1 ≤ n ≤ 10
• cele n numere citite vor fi mai mici decât 1.000.000.000 și vor fi distincte
#include <iostream>
using namespace std;
int x[10],n,aux,v[100],vmin,pmin;
int Solutie(int k)
{ if(k==n) return 1;
else return 0;
} int OK(int k)
{for(int i=1;i<k;i++)
if(x[i]==x[k]) return 0;
if(v[x[k]]==vmin && k!=pmin) return 0;
return 1;}
void Afisare(int k)
{for(int i=1;i<=k;i++)
cout<<v[x[i]]<<" ";
cout<<endl; }
void Back(int k){
for(int i=1;i<=n;i++)
{ x[k]=i;
if(OK(k))
if(Solutie(k))
Afisare(k);
else Back(k+1); } }
int main(){ cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
vmin=v[1];
pmin=1;
for(int i=1;i<=n;i++)
if(v[i]<vmin)
{vmin=v[i];
pmin=i;}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if(v[i]>v[j])
{ aux=v[i];
v[i]=v[j];
v[j]=aux; }
Back(1); return 0;}
#197Combinari
Cerinţa
Se citesc două numere naturale nenule n și k. Să se afişeze, în ordine lexicografică,
submulțimile de câte k elemente ale mulţimii {1,2,..,n}.
Date de intrare
Fişierul de intrare combinari.in conţine pe prima linie numerele n și k, separate printr-un
spatiu.
Date de ieşire
Fişierul de ieşire combinari.out va conţine pe fiecare linie câte k valori, separate prin câte
un spaţiu, reprezentând elementele unei submulțimi.
Restricţii şi precizări
• 1 ≤ k ≤ n ≤ 15
• elementele fiecărei submulţimi vor fi afişate în ordine crescătoare
#include <fstream>
using namespace std;
ifstream f("combinari.in");
ofstream g("combinari.out");
int x[10],n,p;
int Solutie(int k){
if (k==p) return 1;
else return 0;
} int OK(int k){
for (int i=1; i<k;i++)
if (x[k]==x[i]) return 0;
if (k>1)
if(x[k-1]>x[k]) return 0;
return 1;
} void Afisare(int k)
{for (int i=1;i<=k;i++)
g<<x[i]<<" ";
g<<endl;}
void Back(int k){
for(int i =1 ; i <= n ; ++i)
{x[k]=i;
if( OK(k) )
if(Solutie(k))
Afisare(k);
else
Back(k+1); } }
int main(){
f>>n>>p;
Back(1);
return 0;}
#3156perm_min_max
Cerința
Se citește o mulțime cu n numere naturale. Afișați în ordine lexicografică toate
permutările mulțimii citite în care elementul minim și cel maxim nu își schimbă poziția.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale distincte,
separate prin spații.
Date de ieșire
Programul va afișa pe ecran permutările cerute, pe rânduri separate, fiecare permutare
având elementele separate prin câte un spațiu.
Restricții și precizări
• 1 ≤ n ≤ 10
• cele n numere citite vor fi mai mici decât 1.000.000.000 și vor fi distincte
#include <iostream>
using namespace std;
int x[10],n,aux,v[100],vmin,pmin,pmax,vmax;
int Solutie(int k)
{ if(k==n)
return 1;
else return 0;
} int OK(int k)
{ for(int i=1;i<k;i++)
if(x[i]==x[k]) return 0;
if(v[x[k]]==vmin && k!=pmin) return 0;
if (v[x[k]]==vmax && k!=pmax) return 0;
return 1;}
void Afisare(int k)
{ for(int i=1;i<=k;i++)
cout<<v[x[i]]<<" ";
cout<<endl;
} void Back(int k){
for(int i=1;i<=n;i++)
{ x[k]=i;
if(OK(k))
if(Solutie(k))
Afisare(k);
else Back(k+1); } }
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>v[i];
vmin=v[1];
pmin=1;
for(int i=1;i<=n;i++)
if(v[i]<vmin)
{vmin=v[i];
pmin=i;}
vmax=v[1];
pmax=1;
for(int i=1;i<=n;i++)
if(v[i]>vmax)
{vmax=v[i];
pmax=i;}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if(v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
Back(1);
return 0;
}