Pagini recente » Cod sursa (job #2497069) | Cod sursa (job #671184) | Cod sursa (job #1188005) | Cod sursa (job #243886) | Cod sursa (job #109600)
Cod sursa(job #109600)
#include <stdio.h>
#define NMAX 1001
int n, p, k, t, st[101], v[1001], viz[101], a[1001][101], b[1001][101], c1[1001], c2[1001];
int na, nb, l, num;
int aleg(int k)
{
if ( st[k] < n)
{
st[k]++;
return 1;
}
else
return 0;
}
int valid(int k)
{
if ( viz[st[k]]+1>p)
return 0;
else
if ( st[k] == st[k-1] )
return 0;
return 1;
}
int solutie(int k)
{
if ( k == l)
return 1;
else
return 0;
}
int egale(int i)
{
int j;
for ( j = 1; j <= l; j++)
if ( st[j] != a[i][j] )
return 0;
return 1;
}
void rezolv()
{
int i, j;
num++;
for ( i = 1; i <= na; i++)
if ( !c1[i])
if ( egale(i))
{
a[i][0] = num;
c1[i] = 1;
}
for ( i = 1; i <= nb;i++)
if ( !c2[i])
if ( num == b[i][0])
{
for ( j = 1; j <= l; j++)
b[i][j] = st[j];
c2[i] = 1;
}
}
void back()
{
int v, a;
k = 1;
while (k)
{
do
{
a = aleg(k);
if (a)
v = valid(k);
}while (a && !v);
if (a)
{
viz[st[k]]++;
if ( solutie(k) )
{
rezolv();
viz[st[k]]--;
}
else
{
k++;
st[k] = 0;
}
}
else
{
k--;
viz[st[k]]--;
}
}
}
int main()
{
int i, j, aa, bb;
char c;
freopen("nkperm.in", "r", stdin);
freopen("nkperm.out", "w", stdout);
scanf("%d %d %d ", &n, &p, &t);
l = n * p;
for ( i = 1; i <= t; i++)
{
scanf("%c", &c);
if ( c =='A')
{
na++;
for ( j = 1; j <= l; j++)
scanf("%d ", &a[na][j]);
v[i] = 1;
}
else
{
nb++;
scanf("%d ", &b[nb][0]);
}
}
back();
aa = 0;
bb = 0;
for ( i = 1; i <= t; i++)
{
if ( v[i] )
{
aa++;
printf("%d\n", a[aa][0]);
}
else
{
bb++;
for ( j = 1; j <= l; j++)
printf("%d ", b[bb][j]);
printf("\n");
}
}
return 0;
}