Cod sursa(job #233265)

Utilizator ste_fanusGheorghe Stefan ste_fanus Data 17 decembrie 2008 12:02:48
Problema Tablete Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 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()
{
	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;
}