Cod sursa(job #1409065)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 30 martie 2015 13:14:43
Problema Problema Damelor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
using namespace std;
int sol,a[14][14],st[14],n,gas;
ofstream g("damesah.out");
int inter(int l,int c)
{
    int i=1;
    while(i+l<=n && i+c<=n)
    {
        if(a[i+l][c+i]==1) return 0;
        i++;
    }
    i=1;
    while(l-i>=1 && c-i>=1)
    {
        if(a[l-i][c-i]==1) return 0;
        i++;
    }
    i=1;
    while(l-i>=1 && c+i<=n)
    {
        if(a[l-i][c+i]==1) return 0;
        i++;
    }
    i=1;
    while(l+i<=n && c-i>=1)
    {
        if(a[l+i][c-i]==1) return 0;
        i++;
    }
    i=1;
    while(i+l<=n)
    {
        if(a[i+l][c]==1) return 0;
        i++;
    }
    i=1;
    while(l-i>=1)
    {
        if(a[l-i][c]==1) return 0;
        i++;
    }
    i=1;
    while(i+c<=n)
    {
        if(a[l][c+i]==1) return 0;
        i++;
    }
    i=1;
    while(c-i>=1)
    {
        if(a[l][c-i]==1) return 0;
        i++;
    }
    return 1;
}
void verificare()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            a[i][j]=0;
    a[1][st[1]]=1;
    for(i=2;i<=n;i++)
        if(inter(i,st[i])==1) a[i][st[i]]=1;
        else return;
    sol++;
    if(gas==0)
    {
        for(i=1;i<=n;i++)
            g<<st[i]<<" ";
        gas=1;
    }
}
void back(int k)
{
    int i;
    for(i=1;i<=n;i++)
    {
        st[k]=i;
        if(k==n)
            verificare();
        else back(k+1);
    }
}
int main()
{
    ifstream f("damesah.in");
    f>>n;
    back(1);
    g<<"\n"<<sol;
    g.close();
}