Cod sursa(job #1586333)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 1 februarie 2016 05:01:25
Problema Problema Damelor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <bitset>
#include <cmath>

using namespace std;

typedef pair<int, int> Position;

static constexpr size_t maxN()
{
    return 14;
}

bitset<maxN()> queens[maxN()];

int vQueenPositions[maxN()];

static bool areAttacking(const Position& p1, const Position& p2)
{
    //std::cout << (abs(p1.first - p2.first) == abs(p1.second - p2.second)) << " --- " << p1.first << " : " << p1.second << " -- " << p2.first << " : " << p2.second << std::endl;
    return abs(p1.first - p2.first) == abs(p1.second - p2.second) || p1.second == p2.second;
}

int numSol = 0;

fstream fout("damesah.out", fstream::out);

static void solveQueens(int n, int numQueens)
{
    if (numQueens == n)
    {
        if (numSol ==  0)
        {
            for (int i=0; i<numQueens; ++i)
            {
                fout << vQueenPositions[i] + 1 << " ";
            }
            fout << std::endl;
        }
        numSol ++;
        return;
    }

    //int i = numQueens - 1;
    for (int j=0; j<n; ++j)
    {
        bool isSafe = true;
        for (int p=0; p<numQueens; ++p)
        {
            if (areAttacking({p, vQueenPositions[p]}, {numQueens, j}))
            {
                isSafe = false;
                break;
            }
        }
        
        if (isSafe)
        {
            //queens[i][j] = true;
            vQueenPositions[numQueens] = j;
            solveQueens(n, numQueens + 1);
            vQueenPositions[numQueens] = 0;
            //queens[i][j] = false;
        }
    }
}

int main()
{
    fstream fin("damesah.in", fstream::in);
    
    int n;
    fin >> n;
    //cout << n << std::endl;
    
    //std::cout << areAttacking({0, 3}, {1, 2}) << std::endl;
    //std::getchar();
    
    solveQueens(n, 0);
    fout << numSol << std::endl;
    
    return 0;
}