Pagini recente » Cod sursa (job #297895) | Cod sursa (job #448271) | Cod sursa (job #444993) | Cod sursa (job #3772) | Cod sursa (job #233265)
Cod sursa(job #233265)
// 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()
{
freopen(FILE_INPUT, "rt", stdin);
scanf("%d %d", &N, &K);
fclose(stdin);
memset(M, 0, sizeof(M));
memset(Flag, 0, sizeof(Flag));
int i, j, nr, index;
// compunem coloana K
// idee noua, bazata pe faptul ca (i, K) trebuie sa fie cel putin cat cele (i - 1) * N + K - 1 elem din partea stanga si sus
for (i = 1; i <= N; i++)
{
nr = (i - 1) * N + K - 1;
index = nr + 1;
if (index & 1)
index++;
if (i == N)
{
// pe ultima linie, daca-l pun prea mare si cate numere mi-ar ramane nu compenseaza distanta pana la N*N, mai scad 2, pt cel par anterior
if (N * N - index < N - K)
index -= 2;
}
M[i][K] = index;
Flag[index] = 1;
}
// partea stanga, col 1..K - 1
int x = 1;
for (i = 1; i <= N; i++)
for (j = 1; j < K; j++)
{
for (; x <= N * N; x++)
if (Flag[x] == 0) break;
M[i][j] = x;
Flag[x] = 1;
};
// partea dreapta, col K + 1..N
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;
Flag[x] = 1;
};
// afisare
freopen(FILE_OUTPUT, "wt", stdout);
for (i = 1; i <= N; i++, printf("\n"))
for (j = 1; j <= N; j++)
printf("%ld ", M[i][j]);
fclose(stdout);
return 0;
}