Pagini recente » Cod sursa (job #1922962) | Cod sursa (job #639955) | Cod sursa (job #2614190) | Cod sursa (job #2190102) | Cod sursa (job #1555237)
#include<cstdio>
#include<string.h>
using namespace std;
int st[12], n, p;
int v[12];
long long echipe[12];
int maxim(int k)
{
int i;
int maxi=0;
for(i=1;i<=k;i++)
if(maxi<st[i])
maxi=st[i];
return maxi;
}
int verificare(int ec)
{
int nre=0, i, gasit=1, b=0, j;
nre=maxim(n);
if(nre==1)
return 0;
for(i=1;i<=ec;i++)
{
j=1;
while(st[j]!=i)
j++;
b=v[j];
for(j=j+1;j<=n;j++)
{
if(st[j]==i)
b=(b|v[j]);
}
for(j=1;j<=ec;j++)
{
if(j!=i)
if((echipe[j]&b)==0)
return 0;
}
}
return 1;
}
void bkt(int k, int ec)
{
int i;
if(k==n+1)
{
if(verificare(ec))
p++;
}
else{
for(i=1;i<=maxim(k-1)+1;i++)
{
st[k]=i;
echipe[i]+=(1<<k-1);
bkt(k+1, maxim(k));
echipe[i]-=(1<<k-1);
}
}
}
int main()
{
freopen("copii.in", "r", stdin);
freopen("copii.out", "w", stdout);
int i, j, nr=0;
char c;
scanf("%d\n", &n);
for(i=1;i<=n;i++)
{
for(j=0;j<n;j++)
{
c=getchar();
v[i]=v[i]+((c-'0')<<j);
}
c=getchar();
}
bkt(1, 0);
printf("%d", p);
return 0;
}