Cod sursa(job #723810)

Utilizator andreistb1996Satirbasa Andrei andreistb1996 Data 25 martie 2012 21:14:43
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include<cstdio>
using namespace std;
int ok,nr,n,i,j,maxim,x[11],a[11][11],d[11][11];
char c;
ifstream f("copii.in");
ofstream g("copii.out");
int succesor(int k)
{int i;
maxim=0;
 for(i=1;i<k;i++)
	 if(maxim<x[i])
		 maxim=x[i];
	if(x[k]<=maxim && k<=n)
   {x[k]++;
   return 1;
   }
   return 0;
}
int valid(int k)
{return 1;}
int solutie(int k)
{if(k==n)
	return 1;
	return 0;}
void afisare(int k)
{int i,j;
	if(x[k]>maxim)
	maxim=x[k];
  if(maxim>1)
  {for(i=1;i<=maxim;i++)
	   for(j=1;j<=maxim;j++)
	   d[i][j]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==1 && x[i]!=x[j])
d[x[i]][x[j]]=1;}
ok=1;
for(i=1;i<=maxim && ok==1;i++)
for(j=1;j<=maxim && ok==1;j++)
	if(i!=j && d[i][j]==0)
	ok=0;
	if(ok)
		nr++;}
void back()
{int ok,k;
k=1;
x[k]=0;
while(k>0)
   {ok=0;
   while(ok==0 && succesor(k))
   if(valid(k))
	ok=1;
  if(ok==0)
	k--;
else
	if(solutie(k))
		afisare(k);
	else
		{k++;
	x[k]=0;
		}
    }
}
int main()
{f>>n;
for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	{	f>>c;
	a[i][j]=c-48;
	}
	back();
	g<<nr-1<<"\n";
 f.close();
g.close();
return 0;
}