Cod sursa(job #2114441)

Utilizator mihai2003LLL LLL mihai2003 Data 25 ianuarie 2018 16:35:24
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
char prieteni[15][15];
bool folosit[11];
ifstream in("copii.in");
ofstream out("copii.out");
queue<vector<int> >q;
int mat[15][15];
int sol[15];
int nrsol=0;
int X;

bool intersect(int a,int b){
    for(int i=1;i<=mat[a][0];i++)
        for(int j=1;j<=mat[b][0];j++)
            if(prieteni[mat[a][i]][mat[b][j]]=='1')
                return 1;
    return 0;
}

bool verif(int p,int g){
    bool ok=0;
    for(int i=0;i<=g;i++)
        for(int j=0;j<=10;j++)
            mat[i][j]=0;
    for(int i=1;i<=X;i++)
        mat[sol[i]][++mat[sol[i]][0]]=i;
    for(int i=1;i<=g;i++){
        for(int j=1;j<=g;j++)
            if(i!=j)
                if(!intersect(i,j))
                    return 0;
    }
    return 1;
}

void bkt(int p,int n)
{
    if(p-1==X){
        nrsol+=verif(p,n);
        return ;
    }
    for(int i=1;i<=n;i++){
        sol[p]=i;
        bkt(p+1,n);
    }
    sol[p]=n+1;
    bkt(p+1,n+1);
}

int main()
{
    int n;
    in>>n>>ws;
    X=n;
    for(int i=1;i<=n;i++)
        in>>(prieteni[i]+1);
    bkt(1,0);
    out<<nrsol-1;
    return 0;
}