Cod sursa(job #109426)

Utilizator portocalaDiculescu Elena Alexandra portocala Data 25 noiembrie 2007 11:02:07
Problema NKPerm Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 1.22 kb
#include<fstream.h>
#define dim 1000
int n,k,t,v[dim][101],nk,st[101],nr[21];
unsigned long rr,max,a,vv[dim];
ifstream f("nkperm.in");
ofstream g("nkperm.out");
char w[dim];

void compar()
{rr++;
for(int i=0;i<t;i++)
 {if(w[i])
   {if(rr==vv[i])
     for(int j=1;j<=nk;j++)v[i][j]=st[j];}

   else if(!vv[i])
	{int j=1;
	 while((j<=nk)&&(v[i][j]==st[j])) j++;
	 if(j>nk)
	  {vv[i]=rr;a--;}
	}
 }
}

void generare(int niv)
{if(niv>nk) compar();
 else if(a||(rr<max))
       {for(int i=1;i<=n;i++)
	 {if(nr[i])

	   if(st[niv-1]!=i)

	    {st[niv]=i;
	     nr[i]--;
	     generare(niv+1);
	     nr[i]++;
	    }
	 }
       }
}

void afisare()
{int i;
for(i=0;i<t;i++)
 if(w[i]) {for(int j=1;j<=nk;j++)
	    g<<v[i][j]<<" ";
	   g<<'\n';
	  }
  else g<<vv[i]<<'\n';
}

int main()
{int i,j;
unsigned long jj;
char c;
f>>n>>k>>t;
nk=n*k;
for(i=0;i<t;i++)
 {f>>c;
  if(c=='A')
    {a++;
     for(j=1;j<=nk;j++)
      f>>v[i][j];
    }
   else {f>>jj;
	 w[i]=1;
	 vv[i]=jj;
	 if(jj>max)max=jj;
	}
 }
for(i=1;i<=n;i++)nr[i]=k;
/*for(i=0;i<t;i++)
 {g<<vv[i]<<" ";
  for(j=1;j<=nk;j++)
  g<<v[i][j]<<" ";
  g<<'\n';
  }*/
generare(1);
afisare();
f.close();
g.close();
return 0;
}