Cod sursa(job #2986442)

Utilizator MesterelMester Darius Mesterel Data 28 februarie 2023 17:10:14
Problema Problema Damelor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
using namespace std;

ofstream fout("damesah.out");

int map[13][13]; // aparitii dame coloane, linii si diagonale
short int n, vsol[13];
unsigned long long sum=0;

void damafill(int vi, int i, int val){
    int ii=0;
    if (val==0)
        ii=vi+1;

    for (int o=0; o<n; ++o){
        if (map[vi][o]==ii)
            map[vi][o]=val; //linie
        if (map[o][i]==ii)
            map[o][i]=val; //coloana
    }
    //diagonale
    for (int o=1; vi-o>=0 && i-o>=0; ++o)
        if (map[vi-o][i-o]==ii)
            map[vi-o][i-o]=val;  
    for (int o=1; i+o<n && vi-o>=0; ++o)
        if (map[vi-o][i+o]==ii)
            map[vi-o][i+o]=val;
    for (int o=1; vi+o>=0 && i-o>=0; ++o)
        if (map[vi+o][i-o]==ii)
            map[vi+o][i-o]=val;  
    for (int o=1; i+o<n && vi+o<n; ++o)
        if (map[vi+o][i+o]==ii)
            map[vi+o][i+o]=val;
}

void Backt(short int vi){
    for (int i=0; i<n; ++i){
        vsol[vi]=i;

        if (map[vi][i]==0){
            if (vi==n-1){
                if (sum==0)
                    for (int o=0; o<n; ++o)
                        fout<<vsol[o]+1<<' ';
                ++sum;
            } else{ //creare dama negat pe lini, coloana si diagonala
                damafill(vi,i,vi+1);
            /* cout<<vi<<' '<<i<<'\n';
            for (int j=0; j<n; ++j){
                for (int k=0; k<n; ++k)
                    cout<<map[j][k]<<' ';
                cout<<'\n';
                }
            cout<<'\n';
            */
                Backt(vi+1);
            }
        }
    }
    //resetare dame de pe linie, coloana si diagonala
    //cout<<vsol[vi-1]<<'\n';
    if (vi)
        damafill(vi-1,vsol[vi-1],0);
}

int main(){
    ifstream fin("damesah.in");
    fin>>n; 
    short int vi=0;
    Backt(vi);
    fout<<'\n'<<sum;
    return 0;
}