Pagini recente » Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #421480)
Cod sursa(job #421480)
#include <stdio.h>
using namespace std;
#define maxn 4096
long n, i, j, k, ok, mk, sol, ne, cun[20], conf[20], c2, cf[20], nb[20];
char m[20][20];
void back(long poz, long i)
{
long a1, a2;
if(poz == n)
{
if(ne>1)
sol++;
return;
}
if(cf[poz]==0)
{
++ne;
for(long j=1; j<(1<<n); j++)
{
if((j&i)==0 && ((j>>poz) & 1)==1)
{
cun[ne]=0;
for(k=0; k<n; k++)
if((j>>k) &1)
cun[ne]=cun[ne]|nb[k];
cun[ne]=cun[ne]&(((1<<n)-1)-j);
ok=1;
for(k=1; k<ne; k++)
{
if((cun[ne]&conf[k])==0 || (cun[k]&j)==0)
{
ok=0;
break;
}
}
if(ok)
{
conf[ne]=j;
for(k=0; k<n; k++)
if((j>>k)&1)
cf[k]=ne;
back(poz+1, i|j);
for(k=0; k<n; k++)
if((j>>k)&1)
cf[k]=0;
}
}
}
--ne;
}
else
back(poz+1, i);
}
int main()
{
freopen("copii.in", "r", stdin);
freopen("copii.out", "w", stdout);
scanf("%d\n", &n);
for(i=0; i<n; i++)
{
gets(m[i]);
for(j=0; j<n; j++)
{
m[i][j]-='0';
}
for(j=n-1; j>=0; j--)
{
nb[i]=nb[i]*2+m[i][j];
}
}
ne=0;
i=0;
back(0, 0);
printf("%d\n", sol);
return 0;
}