Cod sursa(job #2110435)

Utilizator MarcelVargaMarcel Varga MarcelVarga Data 20 ianuarie 2018 17:25:39
Problema Problema Damelor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;
ifstream fi("damesah.in");
ofstream fo("damesah.out");
int n;
int a[14][14];
int solutii;
void afisarecoloane(){
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]==1) fo<<j<<" ";}
void afisare(){
    for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) fo<<a[i][j]<<" ";fo<<'\n'; }
    fo<<'\n';
}
bool valid(int x, int y){
for(int i=1;i<=n;i++) if(a[x][i]==1 or a[i][y]==1) return 0;
int i,j;
i=x;j=y;
while(i>=1 and j>=1 and i<=n and j<=n){
    i+=1;
    j+=1;
    if(a[i][j]==1) return 0;
}
i=x;j=y;
while(i>=1 and j>=1 and i<=n and j<=n){
    i+=1;
    j-=1;
    if(a[i][j]==1) return 0;
}
i=x;j=y;
while(i>=1 and j>=1 and i<=n and j<=n){
    i-=1;
    j-=1;
    if(a[i][j]==1) return 0;
}
i=x;j=y;
while(i>=1 and j>=1 and i<=n and j<=n){
    i-=1;
    j+=1;
    if(a[i][j]==1) return 0;
}
return 1;
}
void BK(int x,int dame){
for(int y=1;y<=n;y++)
    if(valid(x,y)){
    a[x][y]=1;
    //fo<<x<<" "<<y<<'\n';
    //fo<<dame<<" dame"<<'\n';
    //afisare();
    if(dame==n) {solutii++;
    if(solutii==1) afisarecoloane();
    //fo<<"gasit"<<'\n';afisare();
    }
    BK(x+1,dame+1);
    a[x][y]=0;
}
}
int main()
{
    fi>>n;
    BK(1,1);
    fo<<'\n';
    fo<<solutii;
    return 0;
}