Cod sursa(job #109691)

Utilizator anamaria1Ozorchevici Ana Maria anamaria1 Data 25 noiembrie 2007 12:25:36
Problema NKPerm Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 1.09 kb
#include<fstream.h>
int v[100],n,n2,sol[100],v2[100];
unsigned long nr,x;
ofstream g("nkperm.out");
int bkta(int k)
{int i,ok;
if(k==n2) {nr++;ok=1;
	   for(i=1;i<n2;i++) if(v2[i]!=sol[i]) {ok=0;break;}
	   if(ok) {g<<nr;g<<'\n';return 0;}
	  }
   else
    {for(i=1;i<=n;i++)
      if((k>1)&&v[i]&&(sol[k-1]!=i))
       {sol[k]=i;v[i]--;bkta(k+1);
	v[i]++;
       }
       else if((k==1)&&(v[i])) {sol[k]=i;v[i]--;bkta(k+1);v[i]++;}
    }
}
int bktb(int k)
{int i;
if(k==n2) {nr++;
	   if(nr==x) {for(i=1;i<n2;i++) g<<sol[i]<<" ";g<<'\n';return 0;}
	  }
   else
    {for(i=1;i<=n;i++)
      if((k>1)&&v[i]&&(sol[k-1]!=i))
       {sol[k]=i;v[i]--;bktb(k+1);
	v[i]++;
       }
       else if((k==1)&&(v[i])) {sol[k]=i;v[i]--;bktb(k+1);v[i]++;}
    }
}
int main()
{ifstream f("nkperm.in");
int k,i,t,j;
char c;
f>>n>>k>>t;
n2=n*k+1;
for(i=1;i<=t;i++)
 {f>>c;
  if(c=='A')
   {for(j=1;j<n2;j++) f>>v2[j];
    for(j=1;j<n2;j++) v[j]=k;
    nr=0;bkta(1);
   }
   else
    {f>>x;for(j=1;j<n2;j++) v[j]=k;
     nr=0;bktb(1);
    }
 }
f.close();
g.close();
return 0;
}