Cod sursa(job #507670)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 6 decembrie 2010 16:16:42
Problema Oras Scor 5
Compilator cpp Status done
Runda selectie-vianu-2011 Marime 1.36 kb
#include <cstdio>

const int N = 201;

short sol[N][N]; int n;

bool vizitat[N];

inline int inc(int a, int b)
{
	return (a+b)%n;
}

void inconjurare()
{
	for (int i = 0; i <= n-1; ++i)
		sol[inc(i,1)][inc(i,2)] = true;
}

void trasare(int a, int b)
{
	if ((vizitat[a])||(vizitat[b]))
		return;
	sol[a][b] = true;
}

void stergere(int a, int b)
{
	if ((vizitat[a])||(vizitat[b]))
		return;
	sol[a][b] = false;
}

void creare_sensuri()
{
	for (int k = 0; k <= n-1; ++k)
	{
		for (int i = 2; i <= (n-1)/2; ++i)
			if (i % 2 == 0)
				trasare(inc(i,k),k);
			else
				trasare(k,inc(i,k));
		for (int i = n-2; i >= (n+2)/2; --i)
			if (i % 2 == 0)
				trasare(k,inc(i,k));
				
			else
				trasare(inc(i,k),k);
		if (n % 2 == 0)
		{
			if (sol[k][inc(n/2+1,k)] == true)
				trasare(inc(n/2,k),k);
			else
				trasare(k,inc(n/2,k));
			if (sol[inc(n/2,k)][k])
			{
				stergere(inc(n/2,k),inc(n/2+1,k));
				trasare(inc(n/2+1,k),inc(n/2,k));
			}
		}
		vizitat[k] = true;
	}
}

void afisare()
{
	for (int i = 0; i <= n-1; ++i)
	{
		for (int j = 0; j <= n-1; ++j)
			if (sol[i][j] == true)
				printf("1");
			else
				printf("0");
		printf("\n");
	}
}

int main()
{
	freopen("oras.in","r",stdin);
	freopen("oras.out","w",stdout);
	scanf("%i",&n);
	inconjurare();
	creare_sensuri();
	afisare();
	return 0;
}