Cod sursa(job #117429)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 21 decembrie 2007 14:26:03
Problema Tije Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>

#define MAXN 128

int N;
int st[MAXN][MAXN];
char has[MAXN][MAXN];

inline void move( int S, int D )
{
	int v = st[S][ st[S][0] ];
	has[S][v]--; has[D][v]++;

	st[D][ ++st[D][0] ] = v;
	st[S][ st[S][0]-- ] = 0;
	printf("%d %d\n", S, D);
}

inline int moveToFree( int S, int left )
{
	int poz;
	for (poz = N + 1; poz >= left && (st[poz][0] == N || poz == S); poz--);

	if (poz >= left)
	{
		move(S, poz);
		return 1;
	}
	return 0;
}

int main()
{
	freopen("tije.in", "rt", stdin);
	freopen("tije.out", "wt", stdout);

	scanf("%d", &N);
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
		{
			st[i][ ++st[i][0] ] = i;
			has[i][i]++;
		}

	for (int i = 1; i < N; i++)
	{
		int poz = N + 1;
		for (; st[i][0] > 1; )
		{
			for (; poz > i && st[poz][0] == N; poz--);
			move( i, poz );
		}
		
		for (int k = i + 1; k <= N + 1; k++)
			for (; st[k][0] >= 1 && !has[i][ st[k][ st[k][0] ] ]; move(k, i));

		for (; st[i][0] < N; )
			for (int j = i + 1; j <= N + 1 && st[i][0] < N; j++)
			{
				for (; st[j][0] >= 1 && st[i][0] < N; )
				{
					if (!has[i][ st[j][ st[j][0] ] ])
						move( j, i );
					else
						if (!moveToFree(j, i + 1))
							break;
				}
			}
	}

	for (; st[N + 1][0]; move( N + 1, N ));

	return 0;
}