Cod sursa(job #1835837)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 27 decembrie 2016 14:47:16
Problema Tablete Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
using namespace std;

const int nmax = 1005;
int mat[nmax][nmax];
bool mark[nmax * nmax];

void solve(int N, int K)
{
	for(int i = 1;i <= N * N;++i)
	{
		mark[i] = false;
	}
	
	int up_imp = N * N;
	if(N % 2 == 0)
	{
		--up_imp;
	}
	int cur = 1;
	int i, j;
	for(i = 0;i < N;++i)
	{
		int dif = up_imp - cur;
		if(dif / 2 + 1 < N)
		{
			break;
		}
		
		for(j = 0;j < N;++j)
		{
			if(j == K - 1)
			{
				mat[i][j] = cur - 1;
				mark[cur - 1] = true;
			}
			else
			{
				mat[i][j] = cur;
				cur += 2;
			}
		}
	}
	
	for(j = N - 1;j >= 0;--j)
	{
		if(up_imp < cur)
		{
			break;
		}
		if(j == K - 1)
		{
			mat[i][j] = up_imp + 1;
			mark[up_imp + 1] = true;
		}
		else
		{	
			mat[i][j] = up_imp;
			up_imp -= 2;
		}
	}
	
	int index = 0;
	int pare = 2;
	int up_pare = N * N;
	if(N % 2 != 0)
	{
		--up_pare;
	}
	
	while(index <= j && pare <= up_pare)
	{
		if(mark[pare] == false)
		{
			mat[i][index] = pare;
			++index;
		}
		pare += 2;
	}
	++i;
	j = 0;
	
	while(pare <= up_pare)
	{
		if(mark[pare] == false)
		{
			mat[i][j++] = pare;
		}
		if(j == N)
		{
			++i;
			j = 0;
		}
		pare += 2;
	}
}

int main()
{
	ifstream in("tablete.in");
	ofstream out("tablete.out");
	
	int N, K;
	in >> N >> K;
	
	solve(N, K);
	for(int i = 0;i < N;++i)
	{
		for(int j = 0;j < N;++j)
		{
			out<<mat[i][j]<<" ";
		}
		out<<"\n";
	}
	in.close();
	out.close();
}