Cod sursa(job #230901)

Utilizator TYTUSVlad Saveluc TYTUS Data 14 decembrie 2008 10:54:43
Problema Tablete Scor 100
Compilator cpp Status done
Runda Algoritmiada 2009, Runda 1, Clasele 9-10 Marime 2.36 kb
#include <cstdio>
#include <cstring>

const int NMAX = 1000;
int mat[NMAX][NMAX];
bool used[NMAX * NMAX + 1];

int n, k;

void solve()
{
	int rem = 0, nr = 1;
	k--;
	for (int i = 0; i < n; ++i)
	{
		int j = 0;
		if (rem)
		{
			mat[i][j++] = rem;
			rem = 0;
		}
		for (; j < k; j++)
		{
			mat[i][j] = nr++;
		}
		if (nr % 2)
		{
			rem = nr++;
			mat[i][j] = nr++;
		} 
		else
		{
			mat[i][j] = nr++;
		}

	}

	for (int i = 0; i < n; ++i)
	{
		int j = k + 1;
		if (rem)
		{
			mat[i][j++] = rem;
			rem = 0;
		}
		for (; j < n; ++j)
		{
			mat[i][j] = nr++;
		}
	}
}

void print()
{
	int i, j;
	for (i = 0; i < n; ++i, printf ("\n"))
		for (j = 0; j < n; ++j)
			printf ("%d ", mat[i][j]);
}


//daca sunt distincte si sunt in intervalul 1 ... n^2
bool test1()
{
	memset(used, 0, sizeof(used));
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
		{
			if (mat[i][j] < 1 || mat[i][j] > n * n)
				return false;
			if (used[mat[i][j]])
				return false;
			used[mat[i][j]] = true;
		}
	return true;
}

//test daca liniile sunt in ordine crescatoare
bool test2()
{
	int i, j, last;
	for (i = 0; i < n; ++i)
	{
		last = mat[i][0];
		for (j = 1; j < n; ++j)
		{
			if (mat[i][j] <= last)
			{
				return false;
			}
			last = mat[i][j];
		}
	}
	return true;
}


//testez daca coloana 3 e para
bool test3()
{
	int i;
	for (int i = 0; i < n; ++i)
	{
		if (mat[i][k] % 2) 
			return false;
	}
	return true;
}

bool test()
{
	bool ok = true;
	if (!test1())
	{
		printf ("Test 1 ... failed\n");
		ok = false;
	}
	else
	{
		printf ("Test 1 ... ok\n");
	}
	if (!test2())
	{
		printf ("Test 2 ... failed\n");
		ok = false;
	}
	else
	{
		printf("Test 2 ... ok\n");
	}

	if (!test3())
	{
		printf ("Test 3 ... failed\n");
		ok = false;
	}
	else
	{
		printf ("Test 3 ... ok\n");
	}
	return ok;
}


void verif()
{
	while (1)
	{
		scanf ("%d %d", &n, &k);
		if (n == 0 && k == 0) 
			break;
		solve();
		if (!test())
		{
			print();
			break;
		}
	}
}

int main()
{
	FILE* fin = fopen("tablete.in", "r");
	fscanf (fin, "%d %d", &n, &k);
	solve();
	fclose(fin);
	FILE *fout = fopen("tablete.out", "w");
	for (int i = 0; i < n; ++i, fprintf (fout, "\n"))
		for (int j = 0; j < n; ++j)
			fprintf (fout, "%d ", mat[i][j]);
	fclose(fout);
	return 0;
}