You are on page 1of 2

#include <iostream>

#include <stdlib.h>
using namespace std;
#define NMAX 10
int S[NMAX];//coloanele unde sunt plasate reginele
int nrSolutii;//toate solutiile oferite de backtracking, ignorand simetria acest
ora
void initializareSolutie(int row){
S[row] = 0;
}
bool potCompletaSolutia(int row, int N){
bool rez = false;
while((!rez)&&(S[row]<N)){
S[row]++;
rez = true;
for (int i = 1; i<row; i++)
if((S[row]==S[i])||(abs(S[row]-S[i]) == (abs(row-i)))) r
ez = false;
}
return rez;
}
bool solutieFinala(int row, int N){
return (row==N);
}
void tiparesteSolutia(int N){
for(int i = 1; i<=N; i++) cout << S[i] << "\t";
cout << endl;
}
void backtrackingInterativ(int N){
int row = 1;
initializareSolutie(row);
while (row > 0){
if(potCompletaSolutia(row, N))
if(solutieFinala(row, N)){
tiparesteSolutia(N);
nrSolutii++;
}
else{
row++;
initializareSolutie(row);
}
else row--;
}
}
void backtrackingRecursiv(int N, int row){
if(row == N+1) tiparesteSolutia(N);
else{
int i, j;
bool rez;
for(i = 1; i <= N; i++){//adaugam pe linia curenta o noua regina
, pe coloana S[row]
S[row] = i;
rez = true;
for(j = 1; j < row; j++)
if((S[row]==S[j])||(abs(S[row]-S[j]) == (abs(row
-j)))) rez = false;
if(rez) backtrackingRecursiv(N, row + 1);// dc linia row
, coloana i e o solutie, trecem la plasarea unei regine pe urmatoarea linie
}
}
S[row] = 0;
}

int main(){
int N = 4;
// cout << "Introduceti numarul reginelor: ";
// cin >> N;
backtrackingInterativ(N);
cout << "Avem " << nrSolutii << " solutii pt " << N << " regine" << endl
;
cout << endl << "Backtracking recursiv" << endl;
backtrackingRecursiv(N, 1);
system("PAUSE");
return 0;
}

You might also like