Cod sursa(job #443489)

Utilizator pandaemonAndrei Popescu pandaemon Data 17 aprilie 2010 03:48:27
Problema Copii Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#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]; 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(niv==i+1) { if(cnt==n && check(i)==1) sol++; }
   else
    { if(limita[niv]>=1) { 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]++; 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'; }
    
    IOR(2,n) back(1,1);   
     
    printf("%d\n",sol); return 0;
}