Cod sursa(job #443491)

Utilizator pandaemonAndrei Popescu pandaemon Data 17 aprilie 2010 04:55:55
Problema Copii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 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];     
      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;
}