Cod sursa(job #507687)

Utilizator AndreyPAndrei Poenaru AndreyP Data 6 decembrie 2010 16:40:57
Problema Oras Scor 25
Compilator cpp Status done
Runda selectie-vianu-2011 Marime 1.48 kb
#include <cstdio>
#define N 210

int n;
char a[N][N];

inline bool put3(int k) {
	while(k>1) {
		if(k%3==0) {
			k /= 3;
			continue;
		}
		return false;
	}
	return true;
}

void rezolva3(int pr,int ul) {
	if(pr==ul)
		return;
	int lun = (ul-pr+1)/3;
	int s1 = pr;
	int s2 = pr+lun;
	int s3 = s2+lun;
	
	for(int i=s1; i<s2; ++i) {
		for(int j=s2; j<s3; ++j)
			a[i][j] = '1';
	}
	
	for(int i=s2; i<s3; ++i) {
		for(int j=s3; j<=ul; ++j)
			a[i][j] = '1';
	}
	
	for(int i=s3; i<=ul; ++i) {
		for(int j=s1; j<s2; ++j)
			a[i][j] = '1';
	}
	
	rezolva3(s1,s2-1);
	rezolva3(s2,s3-1);
	rezolva3(s3,ul);
}

inline void scrie() {
	for(int i=1; i<=n; ++i) {
		for(int j=1; j<=n; ++j)
			fputc(a[i][j],stdout);
		fputc('\n',stdout);
	}
}

int main() {
	freopen("oras.in","r",stdin);
	freopen("oras.out","w",stdout);
	
	scanf("%d",&n);
	
	for(int i=1; i<=n; ++i) {
		for(int j=1; j<=n; ++j)
			a[i][j] = '0';
	}
	
	if(put3(n)) {
		rezolva3(1,n);
		scrie();
		return 0;
	}
	
	if(n==5) {
		fputs("00001\n10010\n11000\n10100\n01110\n",stdout);
		return 0;
	}
	
	if(n==6) {
		fputs("000011\n100101\n110000\n101000\n011100\n001110\n",stdout);
		return 0;
	}
	
	if(n==7) {
		fputs("0000001\n1000010\n1100100\n1110000\n1101000\n1011100\n0111110\n",stdout);
		return 0;
	}
	
	if(n==8) {
		fputs("00000011\n10000101\n11001000\n11100000\n11010000\n10111000\n01111100\n00111110\n",stdout);
		return 0;
	}
	
	printf("-1\n");
	
	return 0;
}