Cod sursa(job #749031)

Utilizator geniucosOncescu Costin geniucos Data 15 mai 2012 17:28:21
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>
#include<cstring>
using namespace std;
int nr1,k,j,p,n,k1,i,x[32],ma[32],mul[14][14],ap[14][14],nr[14][14],b[14][14];
char a1[30];
void back()
{
	k=1;
	x[k]=0;
	while(k>0)
	{
		while(x[k]<ma[k-1]+1&&k<=n)
		{
			x[k]++;
			ma[k]=ma[k-1];
			if(x[k]>ma[k]) ma[k]=x[k];
			if(k==n&&ma[k]>1)
			{
				memset(ap,0,sizeof(ap));
				memset(nr,0,sizeof(nr));
				memset(nr,0,sizeof(mul));
				for(i=1;i<=ma[k];i++)
				{
					for(j=1;j<=n;j++)
						if(x[j]==i)
						{
							nr[i][0]++;
							nr[i][nr[i][0]]=j;
						}
					for(j=1;j<=nr[i][0];j++)
						for(p=1;p<=b[nr[i][j]][0];p++)
							if(ap[i][b[nr[i][j]][p]]==0)
							{
								mul[i][0]++;
								mul[i][mul[i][0]]=b[nr[i][j]][p];
								ap[i][b[nr[i][j]][p]]=1;
							}
				}
				for(i=1;i<=ma[k];i++)
				{
					for(j=1;j<=ma[k];j++)
						if(i!=j)
						{
							for(p=1;p<=nr[j][0];p++)
								if(ap[i][nr[j][p]]==1) break;
							if(p>nr[j][0]) break;
						}
					if(j<=ma[k]) break;
				}
				if(i>ma[k]) 
					nr1++;
			}
			else
			if(k<n)
			{
				k++;
				x[k]=0;
			}
		}
		ma[k]=0;
		k--;
	}
}
int main()
{
freopen("copii.in","r",stdin);
freopen("copii.out","w",stdout);
scanf("%d\n",&n);
for(i=1;i<=n;i++)
{
	gets(a1+1);
	for(j=1;j<=n;j++)
		if(a1[j]=='1')
		{
			b[i][0]++;
			b[i][b[i][0]]=j;
		}
}
back();
printf("%d\n",nr1);
return 0;
}