Cod sursa(job #1116552)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 22 februarie 2014 17:47:30
Problema Problema Damelor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>

inline bool free(const short &i, const short &j, const short &n,
                 const std::vector<bool> &col,
                 const std::vector<bool> &prd,
                 const std::vector<bool> &secd){
    return !(col[j]||prd[n+i-j]||secd[i+j]);
}

int main(){
    std::ifstream fin("damesah.in");
    std::ofstream fout("damesah.out");

    short n; fin>>n;
    unsigned modalitati=0;

    std::vector<bool> col(n,false),prd(2*n,false),secd(2*n,false);


    std::vector<short> k(n,-1);

    short i=0;
    while(i>-1){
        bool cont=true;
        if(k[i]==n-1){
            k[i]=-1;
            col[n-1]=false;
            prd[i+1]=false;
            secd[i+n-1]=false;
            cont=false;
            --i;
        }
        else{
            if(k[i]!=-1){ col[k[i]]=false; secd[i+k[i]]=false; prd[n+i-k[i]]=false; }
            short j=-1;
            for(short j2=k[i]+1;j2<n;++j2)
                if(free(i,j2,n,col,prd,secd)){ j=j2; break; }

            if(j==-1){ k[i]=-1; --i; cont=false; }
            else{ k[i]=j; col[j]=true; secd[i+j]=true; prd[n+i-j]=true; }
        }

        if(cont){
            if(i==n-1){
                if(modalitati==0){
                    for(short i=0;i<n;++i) fout<<k[i]+1<<' ';
                    fout<<'\n';
                }
                ++modalitati;
            }
            else ++i;
        }
    }

    fout<<modalitati<<'\n';
}