Sie sind auf Seite 1von 8

Se genereaz, utiliznd metoda bactracking, cuvintele cu exact 3 litere din mulimea

{a,x,c,f,g}. Dac primele patru cuvinte generate sunt, n ordine, aaa, aax, aac, aaf,
scriei ultimele trei cuvinte care ncep cu litera a, n ordinea n care vor fi generate
#include <iostream>
using namespace std;
int st[4],k,n,a,b,c;
void init (int k)
{
st[k]=0;
}
int succesor (int k)
{
if (st[k]<5)
{
st[k]++;
return 1;
}
return 0;
}
int valid (int k)
{
if (st[1]!=1) return 0;
return 1;
}
int solutie (int k)
{
return n==k;
}
void tipar (int k)
{
int numar=0;
for (int i=1;i<=n;i++) numar=numar*10+st[i];
a=b;
b=c;
c=numar;
}
void back (int k)
{
init (k);
while (succesor(k))
if (valid(k))
if (solutie(k))
tipar(k);
else back(k+1);
}

void invers (int x)


{
int aux=0;
while (x)
{
aux=aux*10+(x%10);
x/=10;
}

while (aux)
{
if (aux%10==1) cout<<"a";
else if (aux%10==2) cout<<"x";
else if (aux%10==3) cout<<"c";
else if (aux%10==4) cout<<"f";
else if (aux%10==5) cout<<"g";
aux/=10;
}

int main()
{
n=3;
back(1);
invers(a); cout<<" ";
invers(b); cout<<" ";
invers(c);
}
Se genereaz, prin metoda backtracking, toate modalitile de aezare a numerelor
naturale de la 1 la 5, astfel nct oricare 2 numere consecutive s nu se afle pe poziii
alturate. Dac primele dou soluii sunt: (1,3,5,2,4) i (1,4,2,5,3), care este prima
soluie generat n care primul numr este 4? (4 p.)
a. (4, 1, 3, 2, 5) b. (4,2,5,1, 3) c. (4, 3, 5, 3, 1) d. (4, 1, 3, 5, 2)
#include <iostream>
using namespace std;
int st[6],k,n,a,b,c,OK=1;
void init (int k)
{
st[k]=0;
}
int succesor (int k)
{
if (st[k]<5)
{
st[k]++;
return 1;
}
return 0;
}

int valid (int k)


{
for (int i=1;i<k;i++)
if (st[i]==st[i+1]+1 || st[i]==st[i+1]-1 || st[i]==st[k]) return 0;
return OK;
}
int solutie (int k)
{
return n==k;
}
void tipar (int k)
{
if (st[1]==4)
if (OK==1)
{
OK=0;
for (int i=1;i<=n;i++)
cout<<st[i];
}
}
void back (int k)
{
init (k);
while (succesor(k))
if (valid(k))
if (solutie(k))
tipar(k);
else back(k+1);
}
int main()
{
n=5;
back(1);
}
Generarea tuturor cuvintelor de trei litere mici, nu neaprat distincte, ale alfabetului englez,
se poate realiza cu ajutorul unui algoritm echivalent cu cel de generare a: (4p.)
a. produsului cartezian b. combinrilor
c. aranjamentelor
a.
#include <iostream>
using namespace std;
int st[4],k,n;
char litere[]="abcdefghijklmnopqrstuvwxyz";
void init (int k)

{
}

st[k]=-1;

int succesor (int k)


{
if (st[k]<25)
{
st[k]++;
return 1;
}
return 0;
}
int valid (int k)
{
return 1;
}
int solutie (int k)
{
return n==k;
}
void tipar (int k)
{
for (int i=1;i<=n;i++)
{
cout<<litere[st[i]];
}
cout<<endl;
}
void back (int k)
{
init (k);
while (succesor(k))
if (valid(k))
if (solutie(k))
tipar(k);
else back(k+1);
}
int main()
{
n=3;
back(1);
}
Utiliznd metoda backtracking, se genereaz n ordine lexicografic toate anagramele
cuvntului caiet ( cuvinte formate din aceleai litere, eventual n alt ordine). Cte cuvinte
vor fi generate? (4p.)
a. 60 b. 100 c. 200 d. 120
D

#include <iostream>
using namespace std;
int st[46],k,c,n;
char litere[]="caiet";
void init (int k)
{
st[k]=-1;
}
int succesor (int k)
{
if (st[k]<4)
{
st[k]++;
return 1;
}
return 0;
}
int valid (int k)
{
for (int i=1;i<k;i++)
if (st[i]==st[k]) return 0;
return 1;
}
int solutie (int k)
{
return n==k;
}
void tipar (int k)
{
c++;
}
void back (int k)
{
init (k);
while (succesor(k))
if (valid(k))
if (solutie(k))
tipar(k);
else back(k+1);
}
int main()
{
n=5;
back(1);
cout<<c;
}

Utiliznd metoda backtracking, se genereaz numerele naturale formate din exact 3 cifre i
care au suma cifrelor egal cu 4, n aceast ordine: 103, 112, 121, 130, 202, 211, 220,
301, 310, 400. Dac utilizm acelai algoritm pentru a genera toate numerele de 4 cifre
care au suma cifrelor egal cu 7, precizai care este numrul generat imediat dup 1222.
(4p.)
a. 1231 b. 1223 c. 1213 d. 1321

#include <iostream>
using namespace std;

int st[6],k,c,n,OK=1,check=0;
char litere[]="caiet";

void init (int k)


{
if (k==1) st[k]=0;
else st[k]=-1;
}

int succesor (int k)


{
if (st[k]<9)
{
st[k]++;
return 1;
}
return 0;
}

int valid (int k)


{

return OK;
}

int solutie (int k)


{
return n==k;
}

void tipar (int k)


{
int i,nr=0;

if (check)
{
int s=0;
for (i=1;i<=n;i++)
{
s+=st[i];
nr=nr*10+st[i];
}
if (s==7) { OK=0; check=0; cout<<nr;}
}

for (i=1;i<=n;i++)
nr=nr*10+st[i];

if (nr==1222)
check=1;

void back (int k)


{
init (k);
while (succesor(k))
if (valid(k))
if (solutie(k))
tipar(k);
else back(k+1);
}

int main()
{
n=4;
back(1);
}

Das könnte Ihnen auch gefallen