Cod sursa(job #2420185)

Utilizator S_DanSochirca Dan S_Dan Data 10 mai 2019 23:02:22
Problema Problema Damelor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;

int n,rs;
int a[100][100];
bool b[100][100];
bool prima=0;

ofstream out("damesah.out");

void back(int lvl,int rand){

    if (lvl==n+1){

        if (prima==0){
            for (int i=1;i<=n;i++){
                for (int j=1;j<=n;j++) if (b[i][j]!=0) {out<<j<<' ';break;}
            }
            prima=1;
            out<<'\n';
        }
        rs++;
    }
    else{

        for (int i=rand;i<=n;i++) for (int j=1;j<=n;j++) if (b[i][j]==0 && a[i][j]==0){
            //toate pozitiile posibile
            b[i][j]=1;

            for (int k=1;k<=i-1;k++) if (b[i-k][j]==0) a[i-k][j]++;
            for (int k=1;k<=n-i;k++) if (b[i+k][j]==0) a[i+k][j]++;

            for (int k=1;k<=j-1;k++) if (b[i][j-k]==0) a[i][j-k]++;
            for (int k=1;k<=n-j;k++) if (b[i][j+k]==0) a[i][j+k]++;

            for (int k=1;k<=min(i,j)-1;k++) if (b[i-k][j-k]==0) a[i-k][j-k]++;
            for (int k=1;k<=min(n-i,n-j);k++) if (b[i+k][j+k]==0) a[i+k][j+k]++;

            for (int k=1;k<=min(i-1,n-j);k++) if (b[i-k][j+k]==0) a[i-k][j+k]++;
            for (int k=1;k<=min(n-i,j-1);k++) if (b[i+k][j-k]==0) a[i+k][j-k]++;

            back(lvl+1,i+1);

            b[i][j]=0;

            for (int k=1;k<=i-1;k++) if (b[i-k][j]==0) a[i-k][j]--;
            for (int k=1;k<=n-i;k++) if (b[i+k][j]==0) a[i+k][j]--;

            for (int k=1;k<=j-1;k++) if (b[i][j-k]==0) a[i][j-k]--;
            for (int k=1;k<=n-j;k++) if (b[i][j+k]==0) a[i][j+k]--;

            for (int k=1;k<=min(i,j)-1;k++) if (b[i-k][j-k]==0) a[i-k][j-k]--;
            for (int k=1;k<=min(n-i,n-j);k++) if (b[i+k][j+k]==0) a[i+k][j+k]--;

            for (int k=1;k<=min(i-1,n-j);k++) if (b[i-k][j+k]==0) a[i-k][j+k]--;
            for (int k=1;k<=min(n-i,j-1);k++) if (b[i+k][j-k]==0) a[i+k][j-k]--;

        }

    }
}

int main(){
    ifstream cin("damesah.in");
    cin>>n;

    back(1,1);

    out<<rs;

}