Cod sursa(job #1257284)

Utilizator kappykkDragos kappykk Data 7 noiembrie 2014 16:01:40
Problema Problema Damelor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#define VM 100
#include <vector>

using namespace std;

int m[VM][VM];

int col[VM];
int d1[VM];
int d2[VM];
int lin[VM];

vector<int> sol;

int k = 0, ok = 1;

void Asezare(int i, int j, int x, int n){
    ///Daca x = 1 plasam dama,
    ///Daca x =-1 luam   dama
    m[i][j] += x;
    lin[i] += x;
    col[j] += x;
    d1[i - j + n] += x;
    d2[i + j] += x;
}

bool Verificare(int i, int j, int n){
    ///Daca e libera pozitia
    return (lin[i] == 0 && col[j] == 0 && d1[i - j + n] == 0 && d2[i + j] == 0);
}

void Dame(int i, int j, int n){
    ///Conditie de oprire
    if(i > n){
        ok = 0;
        ++k;
        return;
    }
    if(j > n){
        if(lin[i] == 1)
            Dame(i + 1 , 1 , n);
    }
    else{
        if(Verificare(i , j , n)){
            ///Daca pozitia e libera punem dama
            Asezare(i , j , 1 , n);
            if(ok)
                sol.push_back(j);
            Dame(i + 1 , 1 ,n);
            ///Luam dama
            Asezare(i , j , -1 , n);
            if(ok)
                sol.pop_back();
        }
        Dame(i , j + 1 , n);
    }
}

ifstream f("damesah.in");
ofstream g("damesah.out");

int main()
{
    int n;
    f>>n;
    Dame(1 , 1 , n);
    for(int i = 0 ; i <= sol.size() ; ++i)
        g<<sol[i]<<" ";
    g<<"\n";
    g<<k;
    return 0;
}