Cod sursa(job #1246634)

Utilizator japjappedulapPotra Vlad japjappedulap Data 21 octombrie 2014 14:05:52
Problema Problema Damelor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <cmath>
using namespace std;

ifstream is ("damesah.in");
ofstream os ("damesah.out");

int N, x[15], sol;
bool b, W[15], NW[35], SW[35];
#define NW (NW+15)

void Dame(int k);
void Write();
bool OK(int k);

int main()
{
    is >> N;
    Dame(1);
    os << sol;
    is.close();
    os.close();
}

void Dame(int k)
{
    if (k > N)
    {
        sol++;
        if (b == 0)
            Write(), b = 1;
        return;
    }
    for (int i = 1; i <= N; ++i)
    {
        x[k] = i;
        if (OK(k))
        {
            W[i] = 1;
            NW[k - x[k]] = 1;
            SW[k + x[k]] = 1;
            Dame(k+1);
            W[i] = 0;
            NW[k - x[k]] = 0;
            SW[k + x[k]] = 0;
        }
    }
};

bool OK(int k)
{
    if (W[x[k]] == 1) return false;
    if (NW[k - x[k]] == 1) return false;
    if (SW[k +x [k]] == 1) return false;
    return true;
};

void Write()
{
    for (int i = 1; i <= N; ++i)
        os << x[i] << ' ';
    os << '\n';
};