Cod sursa(job #1876712)

Utilizator medicinedoctoralexandru medicinedoctor Data 12 februarie 2017 16:11:05
Problema Problema Damelor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
/*#include <fstream>
#include <vector>

using namespace std;

ifstream cin ("damesah.in");
ofstream cout("damesah.out");

vector <int> a(13);
vector <bool> q(13),d1(25),d2(25);
int x=0,n=4;

void bk(int k)
{
    if (k==n)
    {
        if (!x)
        {
            for (int i=0; i<n; cout << a[i]+1 << ' ',i++);
            cout << '\n';
        }
        x++;
        return;
    }
    for (int i=0; i<n; i++)
        if (!q[i] && !d1[i-k+n-1] && !d2[k+i])
        {
            a[k]=i;
            q[i]=d1[i-k+n-1]=d2[i+k]=true;
            bk(k+1);
            a[k]=-1;
            q[i]=d1[i-k+n-1]=d2[i+k]=false;
        }
}

main()
{
    cin >> n;
    bk(0);
    cout << x;
}*/

#include <cstdio>

#define MAX_N 14

int queen[MAX_N];
bool col[MAX_N], main_diag[MAX_N * 2], sec_diag[MAX_N * 2];
int ans;

void bkt( FILE *fout, int l, int n ) {
    if ( l == n ) {
        if ( ans < 1 ) {
            for ( int c = 0; c < n; c++ )
                fprintf( fout, "%d ", queen[c] + 1 );
            fprintf( fout, "\n" );
        }
        ++ans;
    } else {
        for ( int c = 0; c < n; c++ ) {
            if ( !col[c] && !main_diag[c - l + n - 1] && !sec_diag[l + c] ) {
                queen[l] = c;

                col[c] = main_diag[c - l + n - 1] = sec_diag[l + c] = true;
                bkt( fout, l + 1, n );
                col[c] = main_diag[c - l + n - 1] = sec_diag[l + c] = false;
            }
        }
    }
}

int main () {
    FILE *fin, *fout;

    fin = fopen( "damesah.in", "r" );
    int n;
    fscanf( fin, "%d", &n );
    fclose( fin );

    fout = fopen( "damesah.out", "w" );
    bkt( fout, 0, n );
    fprintf( fout, "%d\n", ans );
    fclose( fout );
}