Sunteți pe pagina 1din 12

—----------------------------------------------------------------------------------------------------------------------------

● Îl folosim când avem de generat mai multe soluții


● Soluțiile pe care le vom genera le vom pune într-o stivă
● Stiva o vom vedea ca si pe un vector

k-1

● Presupun ca pana la nivelul (k-1) este formată situația



Ce aduc pe nivel k astfel incat impreuna cu elementele deja duse in stiva sa formeze o
solutie valida?

● Analiză
● Dom de valori? Ce duc în stivă
● Valid (1 sau 0) când elementul dus la nivelul k este ok
● Solutie ➡Afisare

● Funcții
1. Afisare sol (int k)
2. Valid
3.rutina

Rutina:
int st[50]
void back (int k)
{ Dom. de valori
{-duc elem. In stiva
Daca e valid, atunci
Daca e sol atunci
Afisare
Altfel
back(k+1)
}
}

-------------------------------------------------------------------------------------------------------
#include <iostream>

using namespace std;


int n, st[100];
void afisare(int k)
{
for(int i=1;i<=k;i++)
cout<<st[i]<<" ";
cout<<endl;
}
int valid (int k)
{
for (int i=1;i<k;i++)
if(st[k]==st[i])
return 0;
return 1;
}
void backk(int k)
{
for(int i=1;i<=n;i++)
{
st[k]=i;
if(valid(k))
if(k==n)
afisare(k);
else
backk(k+1);
}
}
int main()
{
cin>>n;
backk(1);

return 0;
}

Heyyyyyyy<333333333333lyyy mwah
13/03/2024

-------------------------------------------------------------------------------------------------------

Aranjamente de P luate cate N (A ៱ p ៴ n)


Formula: n!/(n-p)!
D.V l
Valid l
Sol l

#include <iostream>

using namespace std;


int n, p, st[50];
void afisare(int k)
{
for(int i=1;i<=k;i++)
cout<<st[i]<<" ";
cout<<endl;
}

int valid(int k)
{
for(int i=1;i<k;i++)
if(st[k]==st[i])
return 0;
return 1;
}

void backk(int k)
{

for(int i=1;i<=n;i++)
{
st[k]=i;
if(valid(k)==1)
if(k==p)
afisare(k);
else
backk(k+1);
}
}
int main()
{
cin>>n>>p;
backk(1);
return 0;
}
-------------------------------------------------------------------------------------------------------

***SINGURA SCHIMBARE LA FUNCTIA VALID DE LA ARANJAMENTE

int valid(int k)
{
if(k>1)
if(st[k]<=st[k-1])
return 0;
return 1;
}
-------------------------------------------------------------------------------------------------------

PROBLEMA TEMA

2.
#include <iostream>

using namespace std;


int st[30], x[30], n, minn, pmin, maxx, pmax;
void citire ()
{
cin>>n;
for (int i=1; i<=n; i++) cin>>x[i];
}
///functie pentru min, pmin
void fmin (int &pmin, int &minn)
{
minn=10000;
for (int i=1; i<=n; i++)
{
if (x[i]<minn)
{
minn=x[i];
pmin=i;
}
}
}
///functie pentru pmax, maxx
void fmax (int &pmax, int &maxx)
{
maxx=0;
for (int i=1; i<=n; i++)
{
if (x[i]>maxx)
{
maxx=x[i];
pmax=i;
}
}
}
void afisare (int k)
{
for (int i=1; i<=k; i++)
cout<<st[i]<<" ";
cout<<endl;
}
int valid (int k)
{
///elemente distincte
for (int i=1; i<k; i++)
if (st[k]==st[i]) return 0;
///min sa ramana pe poz lui
if (k==pmin && st[k]!=minn ) return 0;
///max sa ramana pe poz lui
if (k==pmax&&st[k]!=maxx) return 0;
return 1;
}
void bacc (int k)
{
for (int i=1; i<=n; i++)
{
st[k]=x[i];
if (valid(k))
if (k==n) afisare (k);
else bacc (k+1);
}
}
int main()
{
citire();
fmin (pmin, minn);
fmax (pmax, maxx);
bacc (1);
return 0;
}

—--------26 martie
2024------------------------------------------------------------------------------------------------
6. Se organizează un eveniment între personajele din desenele animate. La acest
eveniment participă Dexter ce vine împreuna cu sora sa Dee Dee, Fred
Flinstone , soţia sa Wilma, Shaggy şi cu Scooby Doo. Ei vor lua prânzul la masă
însă nu cu toţii se înţeleg bine, astfel ei au preferinţe în ceea ce priveşte modul de
aşezare la masă. Scaunele sunt notate de la 1 la 6, masa fiind dreptunghiulară.
Dexter, deoarece este foarte îngâmfat doreşte să stea doar pe primul loc, iar
Scooby doreşte să stea lângă el. Fiindcă Shaggy şi Scooby sunt prieteni de
nedespărţit, Shaggy doreste să stea lângă Scooby. Să se afişeze toate
posibilităţile de aranjare la masă, îdeplinindu-se toate condiţiile menţionate mai
sus.
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int st[10];
char x[10][15];

void citire()
{
for(int i=1;i<=6;i++)
fin.getline(x[i],14);
}
void afisare(int k)
{
for(int i=1;i<=6;i++)
fout<<x[st[i]]<<" ";
fout<<endl;
}
int valid(int k)
{
//elemente distincte
for(int i=1;i<k;i++)
if(st[i]==st[k])
return 0;
// dexter-pozitia 1
if(k==1 && st[1]!=1)
return 0;
//scooby sa fie langa dexter
if(k==6 && (st[k]!=3)&& (st[2]!=3))
return 0;
//shaggy sa fie langa scooby
if(k==3 && st[3]!=4 && st[2]==3)
return 0;
if(k==6 && st[5]!=4 && st[6]==3)
return 0;
return 1;
}
void backtracking(int k)
{
for(int i=1;i<=6;i++)
{
st[k]=i;
if(valid(k)==1)
if(k==6)
afisare(k);
else
backtracking(k+1);
}
}
int main()
{
citire();
backtracking(1);
return 0;
}

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