Pagini recente » Cod sursa (job #267254) | Cod sursa (job #3041305) | Cod sursa (job #125165) | Cod sursa (job #11750) | Cod sursa (job #109688)
Cod sursa(job #109688)
#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;
}