Cod sursa(job #433782)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 4 aprilie 2010 12:38:36
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include<cstring>

using namespace std;
int lib[11],fr[11],a[11],n,x[11],mat[11][11];
long long sol;
string s;
 ifstream fi("back.in");
 ofstream fo("back.out");
 bool verifica(void)
 {
   int i,j,t,ok;
   memset(x,0,sizeof(x));
   ok=1;
   if(fr[2]==0) ok=0; else
   for(i=1;i<=10 and fr[i]==1;i++)
   {
     for(j=1;j<=n;j++)
     if(a[j]==i) for(t=1;t<=n;t++)
                     if(mat[j][t]==1) x[a[t]]=1;

    for(j=1;j<=n;j++)
    if((j!=i)&&(fr[j]!=0)&&(x[j]!=1)) { ok=0; break;  }
    if(ok==0) break;
   }
   if(ok==0) return 0; else return 1;



 }
void tipareste(void)
{
  int i,ok;
  memset(fr,0,sizeof(fr));
  for(i=1;i<=n;i++)
  fr[a[i]]=1;
  ok=1;
  for(i=2;i<=10;i++)
  if((fr[i]==1)&&(fr[i-1]==0)) ok=0;
  if(ok==1)
  {
  if(verifica()) sol++;
  /*{
  for(i=1;i<=n;i++)
  fo<<a[i]<<" ";
  fo<<"\n";
  }
  */
  }
}

void back(int k)
{
  int i;
  if(k==n+1) tipareste(); else
                    for(i=1;i<=n;i++)
                                {
                                     //if((k==1)&&(i==2)) break;
                                     a[k]=i;
                                     if((a[k]==a[k-1])||(a[k]==a[k-1]+1)||(a[k]+1==a[k-1]))
                                     back(k+1);

                                }

}
int main()
{
    int i,j;
    ifstream fi("back.in");
    ofstream fo("back.out");
    sol=0;
    fi>>n;
    getline(fi,s);
    for(i=1;i<=n;i++)
    {
      getline(fi,s);
      for(j=0;j<=n-1;j++)
      if(s[j]-48==1) mat[i][j+1]=1;
    }
    back(1);
     fo<<sol<<"\n";
    return 0;
}