Pagini recente » Cod sursa (job #1522057) | Cod sursa (job #1514670) | Cod sursa (job #1183063) | Istoria paginii runda/penultimainaintedeotv | Cod sursa (job #421417)
Cod sursa(job #421417)
#include <stdio.h>
#include <vector>
#define NMAX 12
#define LMAX 25
#define pb push_back
using namespace std;
int n,A[NMAX][NMAX],poz,rez,B[NMAX],r,s,D[NMAX];
char marc[NMAX],line[LMAX];
vector <int> C[NMAX];
void read()
{
scanf("%d\n",&n);
int i,j;
for (i=1; i<=n; i++)
B[i]=i;
for (i=1; i<=n; i++)
{
fgets(line+1,LMAX,stdin);
for (j=1; j<=n; j++)
A[i][j]=line[j]-'0';
}
r=n;
}
int verif(int subs)
{
int i,j,k,ok1,ok2,nr,nr2;
if (subs == 1)
return 1;
for (i=1; i<subs; i++)
{
ok1=0; ok2=0;
for (j=0; j<C[i].size(); j++)
{
nr=C[i][j];
for (k=0; k<C[subs].size(); k++)
{
nr2=C[subs][k];
if (A[nr][nr2])
ok1=1;
if (A[nr2][nr])
ok2=1;
}
}
if (!ok1 || !ok2)
return 0;
}
return 1;
}
void part(int subs)
{
int i,j,t= (1<<(r-1))-1,p=(1<<r)-1,act,act2,l,E[NMAX];
l=r;
for (i=1; i<=r; i++)
E[i]=B[i];//salvare vector
if (!verif(subs-1))
return ;
if (r==0)
{
if( subs != 2)
rez++;
return ;
}
for (i=0; i<=t; i++)
{
act=(i<<1)+1;
act2=p ^ act;
C[subs].clear();
s=0;
for (j=1; j<=r; j++)
{
if (act & 1<<(j-1))
C[subs].pb(B[j]);
if (act2 & 1<<(j-1))
D[++s]=B[j];
}
r=s;
for (j=1; j<=s; j++)
B[j]=D[j];
part(subs+1);
r=l;
for (j=1; j<=r; j++)
B[j]=E[j];
}
}
int main()
{
freopen("copii.in","r",stdin);
freopen("copii.out","w",stdout);
read();
part(1);
printf("%d\n",rez);
return 0;
}