Cod sursa(job #2878061)

Utilizator Vasile_AndreiVasile Andrei Calin Vasile_Andrei Data 25 martie 2022 19:13:46
Problema Copii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("copii.in");
ofstream fout("copii.out");

int nr,N,st[11];
bool p[11][11];

bool verif_sub(int a[]){
    if(a[0]==1) return true;

    for(int i=1;i<=a[0];++i)
        for(int j=1;j<=a[0];++j){
            if(i==j) ++j;
            if(!p[j][i]) return false;
        }

    return true;
}

bool verif(int M){
    if(M==1) return false;

    int a[11];
    bool ok=false;
    for(int i=1;i<=M;++i){
        a[0]=0;
        for(int j=1;j<=N;++j)
            if(st[j]==i) a[++a[0]]=j;
        if(a[0]>1) ok=true;
        if(!verif_sub(a)) return false;
    }

    return ok;
}

void backtracking(int k, int M){
    for(int i=1;i<=M+1;++i){
        st[k]=i;

        if(k==N){
            if(i<=M && verif(M)) ++nr;
            else if(verif(M+1)) ++nr;
        }
        else{
            if(i<=M) backtracking(k+1,M);
            else backtracking(k+1,M+1);
        }
    }
}

int main(){
    int i,j;
    char ch;

    fin>>N;
    for(i=1;i<=N;++i)
        for(j=1;j<=N;++j){
            fin>>ch;
            p[i][j]=(bool)(ch-'0');
        }

    st[1]=1;
    backtracking(2,1);

    fout<<nr;

    fin.close();
    fout.close();
    return 0;
}