Cod sursa(job #1107629)

Utilizator TodeaDariustodea darius TodeaDarius Data 14 februarie 2014 00:14:39
Problema Problema Damelor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<cstdio>
using namespace std;
int n,d1[15][15],d2[15][15],l[15],c[15],diag1[30],diag2[30],v[15],sol,ok;
void diagonala1()
{
    int nr,ii,j,i,jj;
    nr=1;
    for( i=n;i>=1;i--)
    {
        ii=i;j=1;
        while(ii<=n)
        {
            d1[ii][j]=nr;
            ii++;
            j++;
        }
        nr++;
    }
    for(j=2;j<=n;j++)
    {
        jj=j;i=1;
        while(jj<=n)
        {
            d1[i][jj]=nr;
            i++;
            jj++;
        }
        nr++;
    }

}
void diagonala2()
{
    int nr,jj,ii,i,j;
    nr=1;
    for(j=1;j<=n;j++)
    {
        jj=j;ii=1;
        while(jj>=1)
        {
            d2[ii][jj]=nr;
            ii++;
            jj--;
        }
        nr++;
    }
    for(i=2;i<=n;i++)
    {
        ii=i;
        jj=n;
        while(ii<=n)
        {
            d2[ii][jj]=nr;
            ii++;
            jj--;
        }
        nr++;
    }
}
void afisare()
{
    for(int i=1;i<=n;i++)
        printf("%d ",v[i]);
    printf("\n");
}
void back(int poz)
{
    if(poz<=n)
    {
        for(int j=1;j<=n;j++)
            if(l[poz]==0 && c[j]==0 && diag1[d1[poz][j]]==0 && diag2[d2[poz][j]]==0)
            {
                l[poz]=1;
                c[j]=1;
                diag1[d1[poz][j]]=1;
                diag2[d2[poz][j]]=1;
                v[poz]=j;
                back(poz+1);
                l[poz]=0;
                c[j]=0;
                diag1[d1[poz][j]]=0;
                diag2[d2[poz][j]]=0;
            }
    }
    else
    {
        if(ok==0)
        {
            afisare();
            ok=1;sol++;
        }
        else
            sol++;
    }
}
int main()
{
    freopen("damesah.in","r",stdin);
    freopen("damesah.out","w",stdout);

    scanf("%d",&n);
    diagonala1();
    diagonala2();
    back(1);
    printf("%d\n",sol);
    return 0;
}