Cod sursa(job #2312159)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 4 ianuarie 2019 13:20:43
Problema Problema Damelor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;
ifstream fin("damesah.in");
ofstream fout("damesah.out");
short n;
int rez;
bool M[15][15],afisare;
bool Coloana[15];
void Bkt(short),Afis();
bool Posibil(short,short);
void AfisareM(){
    int i,j;
    for(i=0;i<n;++i){
        for(j=0;j<n;++j)fout<<M[i][j]<<' ';
        fout<<'\n';
    }
}
int main(){
    fin>>n;
    Bkt(0);
    fout<<rez<<'\n';
    return 0;
}
void Bkt(short x){
    short i;
    if(x==n){
        --x;
        for(i=0;i<n;++i)if(M[x][i])break;
        if(Posibil(x,i)){
            if(!afisare){
                afisare=1;
                Afis();
            }++rez;
        }return;
    }
//    AfisareM();fout<<'\n';
    for(i=0;i<n;++i){
        while(i<n&&Coloana[i])++i;
        if(i==n)break;
        if(Posibil(x,i)){
            Coloana[i]=1;
            M[x][i]=1;
            Bkt(x+1);
            Coloana[i]=0;
            M[x][i]=0;
        }
    }
}
bool Posibil(short a,short b){
    short ca=a,cb=b;
    --a,--b;
    while(a>=0&&b>=0){//sus
        if(M[a][b])return 0;
        --a,--b;
    }a=ca,b=cb;
    --a,++b;
    while(a>=0&&b<n){
        if(M[a][b])return 0;
        --a,++b;
    }
    return 1;
}
void Afis(){
    int i,j;
    for(i=0;i<n;++i){
        for(j=0;j<n;++j){
            if(M[i][j]){
                fout<<j+1<<' ';
                break;
            }
        }
    }fout<<'\n';
}