Răspuns :
Răspuns:
#include <iostream>
using namespace std;
//in 'rezultat' se formeaza numarul
//in 'cifre' sunt cifrele numarului 'n'
//x este un index folosit pentru a itera in liste
int rezultat[10], cifre[10], n, x=0;
//in functia asta se desface numarul 'n' in cifre
void din_numar_in_cifre(int n)
{
int i = 0;
while(n > 0)
{
cifre[i++] = (n - ((n / 10) * 10));
n /= 10;
x++;
}
}
//afiseaza rezultatul
void arata()
{
for(int i=1; i<=x; i++)
{
cout << rezultat[i];
}
cout << endl;
}
//verifica daca se repeta o cifra in 'rezultat'
//daca se repeta returneaza 0 (FALS), daca nu returneaza 1 (ADEVARAT)
int valid(int k)
{
for(int i=1; i<k; i++)
{
if(rezultat[k] == rezultat[i])
{
return(0);
}
}
return(1);
}
//aici sunt introduse si/sau comutate cifrele in 'rezultat'
//'k' este un index folosit pentru a itera lista
//si pentru a opri bucla cand s-a format numarul care ne intereseaza
//adica daca in 'rezultat' avem un numar format din acelasi numar de cifre ca
//si in 'cifre' si nu se repeta nici unul.
//ca sa iti explic cum functioneaza functia 'backtrack' o sa imi ia ceva timp,
//asa ca o sa scriu pe scutr:
//la prima apelare cand ajunge la 'backtrack(k+1)' nu se "autoapeleaza";
//in schimb apeleaza o "copie" a functiei 'backtrack()' s.a.m.d.
//sa presupunem ca functia a terminat cu 'copia backtrack', in momentul asta
//se intoarce la 'backtrack()' si continua daca este cazul daca nu se intoarce la
//'backtrack()' precedent s.a.m.d.
void backtrack(int k)
{
for(int i=0; i<x; i++)
{
rezultat[k] = cifre[i];
if(valid(k))
{
if(k == x)
{
arata();
}
else
{
backtrack(k+1);
}
}
}
}
int main()
{
din_numar_in_cifre(542);
backtrack(1);
return(0);
}
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile oferite v-au fost de ajutor. Nu ezitați să ne contactați pentru orice întrebare sau dacă aveți nevoie de asistență suplimentară. Vă așteptăm cu drag data viitoare și nu uitați să ne adăugați la favorite!