Pagini recente » Cod sursa (job #1648086) | Cod sursa (job #922863) | Cod sursa (job #397266) | Cod sursa (job #1305662) | Cod sursa (job #423448)
Cod sursa(job #423448)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define NMAX 13
int V[NMAX], s[NMAX], Gr[NMAX], Pr[NMAX];
int n,sol;
void update(int k){
for(int i = 1; (1<<i) <= V[k] && i <= k; ++i)
if( (1<<i) & V[k])
Pr[s[k]] |= (1<<s[i]);
for(int i = 1; (1<<i) <= V[k] && i <= k; ++i)
if( V[i] & (1<<k))
Pr[s[i]] |= (1<<s[k]);
}
void solutie(int nr){
if(nr<2) return;
for(int i = 1; i <= nr; ++i){
Pr[i] |= (1<<i);
if( Pr[i] != (1<<(nr+1))-2) return;
}
sol++;
}
void back(int k, int nr){
if(k > n){
solutie(nr);
return ;
}
int v[NMAX];
for(int i = 1; i <= nr+1; ++i){
s[k] = i;
Gr[i] += (1<<k);
memcpy(v, Pr, sizeof(Pr));
//Pr[i] |= V[k];
update(k);
back(k+1, max(i, nr));
Gr[i] -= (1<<k);
memcpy(Pr, v, sizeof(v));
}
}
int main(){
freopen("copii.in", "r", stdin);
freopen("copii.out", "w", stdout);
scanf("%d\n", &n);
char S[NMAX];
for(int i = 1; i <= n; ++i){
fgets(S+1, NMAX, stdin);
for(int j = 1; j <= n; ++j)
if(S[j]=='1') V[i] += (1<<j);
}
back(1, 0);
printf("%d\n", sol);
return 0;
}