Pagini recente » Cod sursa (job #2885128) | Cod sursa (job #415168) | Cod sursa (job #1362336) | Cod sursa (job #188039) | Cod sursa (job #443491)
Cod sursa(job #443491)
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#define NMAX 13
#define IOR(aa,bb) for(i=aa; i<=bb; i++)
#define JOR(aa,bb) for(j=aa; j<=bb; j++)
#define LOR(aa,bb) for(l=aa; l<=bb; l++)
int n,i,j,l;
int mat[NMAX][NMAX],s[NMAX][NMAX],first[NMAX],limita[NMAX],sol,cnt;
char TEMP[NMAX],used[NMAX];
int check(int niv)
{
char group[NMAX];
memset(group,0,NMAX);
JOR(1,limita[niv]) LOR(1,n) if(mat[ s[niv][j] ] [l] == 1) group[ used[l] ] = 1;
LOR(1,niv-1) if(group[l]==0) return 0;
return 1;
}
int final_check(int niv)
{ char group[NMAX]; int i;
IOR(1,niv) { memset(group,0,NMAX);
JOR(1,limita[i]) LOR(1,n) if(mat[ s[i][j] ] [l] == 1) group[ used[l] ] = 1;
LOR(1,niv) if(group[l]==0 && l!=i) return 0; }
return 1;
}
int back(int niv,int k)
{
if(cnt==n && niv>1 && final_check(niv)==1) sol++;
if(k>1 && cnt<n) { first[niv]=s[niv][1]; back(niv+1,1); }
if(k==1) s[niv][k]=first[niv-1]; else s[niv][k]=s[niv][k-1];
while(++s[niv][k]<=n)
if(used[s[niv][k]]==0)
{ cnt++; used[ s[niv][k] ]=niv; limita[niv]++; if(check(niv)==1) back(niv,k+1);
cnt--; used[ s[niv][k] ]=0; limita[niv]--; }
}
int main()
{
freopen("copii.in","r",stdin);
freopen("copii.out","w",stdout);
scanf("%d",&n); gets(TEMP); IOR(1,n) { gets(TEMP); JOR(0,n-1) mat[i][j+1]=TEMP[j]-'0'; }
back(1,1);
printf("%d\n",sol); return 0;
}