Cod sursa(job #230937)

Utilizator ste_fanusGheorghe Stefan ste_fanus Data 14 decembrie 2008 10:59:54
Problema Tablete Scor 10
Compilator cpp Status done
Runda Algoritmiada 2009, Runda 1, Studenti Marime 1.68 kb
// 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;
}