Documente Academic
Documente Profesional
Documente Cultură
BACKTRACKING
Problema celor n dame
Enunț
Se dau N dame şi o tablă de şah de dimensiune NxN. Să se găsească toate modalităţile
de a aranja toate damele astfel încât oricare două dame să nu se atace. Două dame se
atacă dacă se află pe aceeaşi linie, coloană sau diagonală. Se cere să se afişeze
soluțiile în ordine lexicografică şi numărul total de soluţii.
Pentru N=4 sunt 2 soluții
Explicații
4
1
3
1. Care sunt mulțimile Modificare funcția Back Ai ={1, 2, 3, …n} (pe fiecare nivel se vor pune
soluțiilor posibile pentru limitele for-ului A=primul elemente de la 1, la n}
fiecare nivel al soluției? element din mulțime, void Back(int k){
B=ultimul for(int i = 1 ; i <= n; ++i)
{
x[k]=i;
if( OK(k) )
if(Solutie(k))
Afisare(k);
else
Back(k+1);
}
}
2. Când avem soluție? Modificare funcția soluție Când stiva este plină (k==n) avem soluție
R: Când am așezat toate int Solutie(int k){
damele. return (k==4)
}
1 2 3 4
De exemplu, în configurația alăturată, dama i=2, este așezată în coloana x[2]=1,
1 iar dama k=3 este în coloana x[3]=2. Nu este o configurație validă deoarece |3-
2 * 2]=|1-2| (adică se află pe aceeași diagonală)
3 *
4
Cum arată soluția? Se modifică funcția void Afisare(int k)
În vectorul x(stivă) se vor Afisare astfel încăt să {
genera sub forma tipărească toate for(int i=1; i:=k; i++)
2, 4, 1, 3 elementele soluției cout<<x[i]<<‘ ‘;
3, 1, 4, 2 cout<<endl;
void afisare(int k)
{
Pentru a afișa sub forma int i,j;
Solutia:1 sol++;
_D__ cout<<"Solutia:"<<sol<<endl;
___D for(i=1;i<=k;i++)
D___ {
__D_ for(j=1;j<=k;j++)
Solutia:2 if(x[i]==j)
__D_ cout<<"D";
D___ else
___D cout<<"_";
_D__ cout<<endl;
}
}