Pagini recente » Cod sursa (job #556052) | Cod sursa (job #1160017) | Cod sursa (job #2577945) | Cod sursa (job #2261103) | Cod sursa (job #117065)
Cod sursa(job #117065)
#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++)
{
if (has[i][ st[k][ st[k][0] ] ]) continue;
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;
}