Cod sursa(job #109360)

Utilizator a7893Nae Mihai a7893 Data 25 noiembrie 2007 10:27:51
Problema NKPerm Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 1.1 kb
#include<stdio.h>
#include<string.h>
#define N 101
int n,k,t,a[N],b,nr,st[N],use[N],ok,nro,v[N];
char c;
int iscorect()
{
	int i;
	if(c=='A')
		for(i=1;i<=n*k;i++)
			if(st[i]!=v[i])
				return 0;
	if(c=='B'&&nr!=nro)
		return 0;
	return 1;
}
int valid(int kb)
{
	if(st[kb]==st[kb-1])
		return 0;
	return 1;
}
void back(int kb)
{
	int i;
	if(ok&&kb>n*k)
	{
		nr++;
		if(iscorect())
			ok=0;
	}
	else
		for(i=1;i<=n&&ok;i++)
		if(use[i]<2&&ok)
		{
			st[kb]=i;
			use[i]++;
			if(ok&&valid(kb))
				back(kb+1);
			use[i]--;
		}
}		
void solve()
{
	int i;
	if(c=='A')
		for(i=1;i<=n*k;i++)
			scanf("%d",&v[i]);
	if(c=='B')
		scanf("%d",&nro);
	ok=1;
	nr=0;
	memset(use,0,sizeof(use));
	back(1);
	if(c=='A')
		printf("%d\n",nr);
	else
	{
		for(i=1;i<n*k;i++)
			printf("%d ",st[i]);
		printf("%d\n",st[i]);
	}
}
void read()
{
	int i;
	scanf("%d%d%d%c",&n,&k,&t,&c);
	for(i=1;i<=t;i++)
	{
		scanf("%c",&c);
		solve();
		scanf("%c",&c);
	}
}
int main()
{
	freopen("nkperm.in","r",stdin);
	freopen("nkperm.out","w",stdout);
	read();
	return 0;
}