Cod sursa(job #735735)

Utilizator danalex97Dan H Alexandru danalex97 Data 17 aprilie 2012 10:32:01
Problema Tablete Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
using namespace std;

ifstream F("tablete.in");
ofstream G("tablete.out");

#define Nm 1005

int N,K;
int A[Nm][Nm];
bool Ok[Nm*Nm];

int main(void)
{
	F>>N>>K;
	
	if ( !(N%2) && !(K%2) )
		for (int i=1;i<=N;++i)
		for (int j=1;j<=K;++j)
			A[i][j]=(i-1)*N+j,
			Ok[(i-1)*N+j]=true;
	
	if ( !(N%2) && (K%2) )
		for (int i=1;i<=N;++i)
		{
			for (int j=1;j<=K;++j)
				A[i][j]=(i-1)*(N-1)+j,
				Ok[(i-1)*(N-1)+j]=true;
			if ( !(i%2) )
				swap(A[i][1],A[i-1][K]);
		}
	
	if ( (N%2) && (K%2) )
	{
		for (int i=1;i<=N-1;++i)
		{
			for (int j=1;j<=K;++j)
				A[i][j]=(i-1)*N+j,
				Ok[(i-1)*N+j]=true;
			if ( !(i%2) )
				swap(A[i][1],A[i-1][K]);
		}
		for (int i=1;i<=K-1;++i)
			A[N][i]=(N-1)*K+i,
			Ok[(N-1)*K+i]=true;
		
		A[N][K]=N*K+1;
		A[1][K+1]=N*K;
		
		Ok[N*K]=true;
		Ok[N*K+1]=true;
	}	
	
	int j=1;
	while ( Ok[j] ) ++j;
	for (int i=1;i<=N;++i)
		for (int ii=1;ii<=N;++ii)
			if ( !A[i][ii] )
			{
				A[i][ii]=j;
				Ok[j]=true;
				while ( Ok[j] ) ++j;
			}
	
	int i;
	for (i=1;i<=N;++i)
	{
		for (j=1;j<=N;++j)
			G<<A[i][j]<<' ';
		G<<'\n';
	}
}