Pagini recente » Cod sursa (job #2215762) | Cod sursa (job #2237396) | Cod sursa (job #3225066) | Cod sursa (job #1630745) | Cod sursa (job #117430)
Cod sursa(job #117430)
#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 (; 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;
}