Cod sursa(job #109600)

Utilizator MarquiseMarquise Marquise Data 25 noiembrie 2007 12:01:53
Problema NKPerm Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 1.69 kb
#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;
}