Cod sursa(job #109463)
Utilizator | Data | 25 noiembrie 2007 11:13:12 | |
---|---|---|---|
Problema | NKPerm | Scor | 0 |
Compilator | cpp | Status | done |
Runda | preONI 2008, Runda 1, Clasele 11-12 | Marime | 2.13 kb |
#include<fstream.h>
int n,m,t,stop;
long long int a,b;
int x[105],y[105];
int cont(int k)
{
int i,p=0;
if (x[k-1]==x[k])
return 0;
for (i=1;i<k;i++)
if (x[i]==x[k])
p++;
if (p>=m)
return 0;
return 1;
}
void chestie1()
{
int i,ok=1;
for (i=1;i<=n*m && ok;i++)
if (x[i]!=y[i])
ok=0;
if (ok)
{
b=a;
stop=1;
}
}
void back1(int k)
{
int i;
for (i=1;i<=n && !stop;i++)
{
x[k]=i;
if (cont(k))
if (k==n*m)
{
a++;
chestie1();
}
else
back1(k+1);
}
}
void chestie2()
{
int i;
if (b==a)
{
for (i=1;i<=n*m;i++)
y[i]=x[i];
stop=1;
}
}
void back2(int k)
{
int i;
for (i=1;i<=n && !stop;i++)
{
x[k]=i;
if (cont(k))
if (k==n*m)
{
b++;
chestie2();
}
else
back2(k+1);
}
}
int main()
{
ifstream in("nkperm.in");
ofstream out("nkperm.out");
in>>n>>m>>t;
int i,j;
char c;
for (j=1;j<=t;j++)
{
in>>c;
stop=0;
if (c=='A')
{
for (i=1;i<=n*m;i++)
in>>y[i];
b=0;
back1(1);
out<<b<<"\n";
}
if (c=='B')
{
in>>a;
b=0;
back2(1);
for (i=1;i<=n*m;i++)
out<<y[i]<<" ";
out<<"\n";
}
}
return 0;
}