Cod sursa(job #231049)

Utilizator skipyGiurgea Mihnea skipy Data 14 decembrie 2008 11:22:05
Problema Tablete Scor 90
Compilator cpp Status done
Runda Algoritmiada 2009, Runda 1, Studenti Marime 1.69 kb
#include <stdio.h>
#define MAX_N 1024

int A[MAX_N][MAX_N], N, K;

int IsFree(int nr, int X)
{
	if (nr % 2 == 1) return 1;
	if (X <= nr && nr <= X + 2 * (N-1)) return 0;
	return 1;
}

void Solve()
{
	int i, j, X, nr;

	if (N % 2 == 0)
		X = K * N;
	else
		X = K * (N - 1);
	for (i = 0; i < N; i++)
		A[i][K] = X + 2 * i;
	nr = 1;
	for (j = 0; j < N; j++)
		if (j != K)
			for (i = 0; i < N; i++)
			{
				A[i][j] = nr;
				nr++;
				if (!IsFree(nr, X)) nr++;
			}
}

/*
int U[MAX_N*MAX_N];

int Check()
{
	int i, j, last;
	for (i = 1; i <= N * N; i++) U[i] = 0;
	
	for (i = 0; i < N; i++)
	for (j = 0; j < N; j++)
	{
		if (A[i][j] < 1 || A[i][j] > N * N) return 0;
		if (U[ A[i][j] ]) return 0;
		U[ A[i][j] ] = 1;
	}

	for (i = 1; i <= N * N && U[i]; i++);
	if (i < N * N) return 0;

	for (i = 0; i < N; i++)
	{
		last = 0;
		for (j = 0; j < N; j++)
		{
			if (!(A[i][j] > last)) return 0;
			last = A[i][j];
		}
	}

	for (i = 0; i < N; i++)
		if (A[i][K] % 2 != 0) return 0;

	return 1;
}

void Test(int testK)
{
	K = testK - 1;
	Solve();
	if (!Check()) printf("Incorrect on K = %d :(\n", testK);
}

void Testcases()
{
		int i;

	while (1)
	{
		scanf("%d", &N);
		Test(2);
		Test(N-1);
		Test(N / 2);
		Test(N / 2 + 1);
		for (i = 3; i < N; i += N / 7)
			Test(i);
		printf("Done testing...\n");
	}
}
*/
int main()
{			 
	freopen("tablete.in", "r", stdin);
	scanf("%d %d", &N, &K);

	K--;
	Solve();

	freopen("tablete.out", "w", stdout);
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
			if (j + 1 == N)
				printf("%d", A[i][j]);
			else 
				printf("%d ", A[i][j]);
		printf("\n");
	}

	return 0;
}