Cod sursa(job #2547301)

Utilizator OvidRata Ovidiu Ovid Data 15 februarie 2020 11:02:11
Problema Problema Damelor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("damesah.in"); ofstream fout("damesah.out");
int n;
bool t[14][14], d[3][30], o[15], v[15];
bool w;





  /*Pe fiecare rand trebuie sa se afle doar o regina, deci,
    vom face recursia in sensul cresterii randurilor, cu iteratie in sensul cresterii coloanelor,
    pentru ca sa fie afisata solutia ce incepe cu coloana cea mai mica.
    Verifiacarea o facem in O(1), folosind vectorii auxiliari d(pentru diagonale, fiecarei diagonale putand fi atribuit un numar propriu),
    o(pentru orizontale), si v(pentru verticale).*/






int dame(int f){
int sol=0;

for(int j=1; j<=n; j++){
int i=f+1;

        if( (d[1][j+i]==false) && (d[2][n+1-j+i]==false) && (o[i]==false) && (v[j]==false) && (t[i][j]==false)   ){

            d[1][j+i]=true; d[2][n+1-j+i]=true; t[i][j]=true; o[i]=true; v[j]=true;

            if( (f+1)==n ){sol+=1; if(!w){w=true; for(int g=1; g<=n; g++){for(int h=1; h<=n; h++){if(t[g][h]==1){fout<<h<<" ";}  } }fout<<"\n";      } }
            else{sol+=dame(f+1);}

            d[1][j+i]=false; d[2][n+1-j+i]=false; t[i][j]=false; o[i]=false; v[j]=false;
        }


}


return sol;
}






int main(){
fin>>n;


fout<<dame(0);




return 0;
}