Cod sursa(job #1474952)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 23 august 2015 11:22:45
Problema Problema Damelor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
using namespace std;
fstream f,g;
int x[200],diag1[200],diag2[200],used[200],sol,n, diag[200];
int a[200][200], b[200][200];
int diagonala( int j, int i) // verifica atacul pe diag
{
    if (diag1[a[i][j]] || diag2[b[i][j]])
        return 1;
    return 0;
}
void modificaDiag(int j, int i, int val )
{
    diag1[a[i][j]] = val;
    diag2[b[i][j]] = val;
}
void backtracking(int nr)
{
    for (int i = 1 ; i<= n; i++)
    {
        if (!used[i] &&  !diagonala(nr, i))
        {
            x[nr] = i;
            used[i] = 1;
            modificaDiag(nr,i,1);

            if (nr == n && sol > 0)
                sol++;

            if (nr == n && sol == 0)
            {
                for(int j = 1; j<=n ; j++)
                    g<<x[j]<<" ";
                g<<'\n';
                sol = 1;
            }
            backtracking(nr + 1 );
            modificaDiag(nr,i,0);
            used[i] = 0;
        }
    }
}
int main()
{
    f.open("damesah.in",ios::in);
    g.open("damesah.out",ios::out);
    f>>n;
    int i, j;
   // cin>>n;
    for (i =1 ; i<=n; i++)
        a[1][i]=i;
    for (i =2 ; i<=n; i++)
        for (j = 1;  j<= n ; j++)
                a[i][j]= a[i-1][j]+1;

     for (i =1 ; i<=n; i++)
        b[n][i]=i;
    for (i =n-1 ; i>0; i--)
        for (j = 1;  j<= n ; j++)
                b[i][j]= b[i+1][j]+1;

    backtracking(1);
    g<<sol;
}