Pagini recente » Cod sursa (job #3032382) | Cod sursa (job #1284183) | Cod sursa (job #1044974) | Cod sursa (job #1625318) | Cod sursa (job #230936)
Cod sursa(job #230936)
// Runda 1 - Tablete
#include <stdio.h>
#include <string.h>
#define FILE_INPUT "tablete.in"
#define FILE_OUTPUT "tablete.out"
int N, K;
char Flag[1000001];
long M[1024][1024];
int main()
{
FILE *f = fopen(FILE_INPUT, "rt");
if (!f)
return -1;
fscanf(f, "%d %d", &N, &K);
fclose(f);
memset(M, 0, sizeof(M));
memset(Flag, 0, sizeof(Flag));
int i, j;
// daca K e par, completam cu 1..N*N, secvential
if (N % 2 == 0)
{
if (K % 2 == 0)
{
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
M[i][j] = (i - 1) * N + j;
} else
{
// K impar, avem coloana cu cele pare: K + 1, 2K, 3K + 1, 4K... completam initial indicii pana la col K din toata partea stanga, apoi coloana K, apoi cu ce ramane completam restul matrice
// la fiecare atribuire, bifez si in Flag numarul respectiv
for (i = 1; i <= N; i++) // linia
for (j = 1; j <= K; j++)
{
int nr = -1;
if (j == K) // col K -> pun ce trebuie
nr = (i & 1) ? (i * K + 1) : (i * K);
else
if (i & 1) // i impar
{
nr = K * (i - 1) + j;
} else // i par
{
if (j == 1)
nr = (i - 1) * K;
else
nr = (i - 1) * K + j;
}
if (nr != -1)
{
M[i][j] = nr;
Flag[nr] = 1;
}
}
// gata cu stanga, inclusiv coloana K
int x = K * N + 1;
for (i = 1; i <= N; i++)
for (j = K + 1; j <= N; j++)
{
for (; x <= N * N; x++)
if (Flag[x] == 0) break;
M[i][j] = x;
}
}
}
// afisare
f = fopen(FILE_OUTPUT, "wt");
for (i = 1; i <= N; i++, fprintf(f, "\n"))
for (j = 1; j <= N; j++)
fprintf(f, "%ld ", M[i][j]);
fclose(f);
return 0;
}