Cod sursa(job #109688)

Utilizator portocalaDiculescu Elena Alexandra portocala Data 25 noiembrie 2007 12:25:14
Problema NKPerm Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 2.15 kb
#include<fstream.h>
#include<string.h>
#define dim 1000
int n,k,t,v[dim][101],a,nk,st[101],nr[21];
//unsigned long rr,max,vv[dim];
ifstream f("nkperm.in");
ofstream g("nkperm.out");
char w[dim],noua='9';
struct nrmare
{int nrc;
 char cif[20];
};
nrmare rr,s,vv[dim],max;

void transf(nrmare &x)
{int i,l;
l=strlen(s.cif);
l--;x.nrc=l;i=0;
while(l>=0)
 {x.cif[l]=s.cif[i];
  l--;i++;
 }
}

void cresc_rr()
{int i;
rr.cif[0]++;
i=0;
while(rr.cif[i]>noua)
 {rr.cif[i+1]++;
  rr.cif[i]='0';
  i++;
 }
//i--;
if(i>rr.nrc)rr.nrc=i;
}

int cmpnrm(nrmare x,nrmare y)
{if(x.nrc==y.nrc)
  {int i=x.nrc;
   while(i>=0)
    {if(x.cif[i]>y.cif[i])return 1;  //1=mai mare
      else if(x.cif[i]<y.cif[i]) return 0;//0=mai mic
     i--;
    }
   return 2;//2=egale
  }
 else if(x.nrc<y.nrc) return 0;
 return 1;
}

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

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

void generare(int niv)
{if(niv>nk) compar();
 else if(a||(cmpnrm(rr,max)==0))
       {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,j;

for(i=0;i<t;i++)
 if(w[i]) {for(j=1;j<=nk;j++)
	    g<<v[i][j]<<" ";
	   g<<'\n';
	  }
  else //afisnrm(vv[i]);//g<<vv[i]<<'\n';
   {for(j=vv[i].nrc;j>=0;j--)
     g<<vv[i].cif[j];
    g<<'\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.get();f.get(s.cif,20,'\n');f.get();//f>>jj;
	 w[i]=1;
	 transf(vv[i]);//vv[i]=s;
	 if(cmpnrm(vv[i],max)==1)max=vv[i];//vv[i]>max;
	}
 }
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';
  }*/
for(i=0;i<20;i++)
rr.cif[i]='0';
generare(1);
afisare();
f.close();
g.close();
return 0;
}