Cod sursa(job #236031)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 26 decembrie 2008 16:36:38
Problema Piese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>

#define NMAX 501//161
struct p2{unsigned l,a;};

unsigned min/*a,[NMAX*NMAX/2]*/;
p2	v[20];
unsigned b[NMAX][NMAX];

unsigned cauta(unsigned x){
unsigned i=0,px=x*x;
while(px>=v[i].a) ++i;

return i-1;
}

unsigned minim(unsigned a,unsigned b){
return a<=b?a:b;
}
unsigned maxim(unsigned a,unsigned b){
return a>=b?a:b;
}

void umple(unsigned l,unsigned c,unsigned dim){
unsigned i,j;
for(i=l;i<=l+dim;++i)
	for(j=c;j<=c+dim;++j)
		b[i][j]=min;
}

void f(unsigned ll,unsigned cc,unsigned l,unsigned c){
unsigned d1,d2,d4,i,dim;
d1=minim(ll,cc);
i=cauta(d1);
d2=ll-v[i].l;
//d3=maxim(ll,cc);
d4=cc-v[i].l;
min++;//a[min]=v[i].a;
dim=v[i].l;
umple(l,c,dim);
if(d2+d4){
	if(d2) f(d2,v[i].l,l+dim,c);
	if(d4) f(v[i].l,d4,l,c+dim);
	if(d2&&d4) f(d2,d4,l+dim,c+dim);
	}
}

int main(){
freopen("piese.in","r",stdin);
freopen("piese.out","w",stdout);
unsigned m,n;
scanf("%u%u",&m,&n);
unsigned i,j;
v[0].l=1;
v[0].a=1;
for(i=1;i<20;++i){
	v[i].l=2*v[i-1].l;
	v[i].a=v[i].l*v[i].l;
	}
f(m,n,0,0);
printf("%u\n",min);
//for(i=1;i<=min;++i) printf("%u ",a[i]);
//printf("\n");
for(i=0;i<m;++i){
	for(j=0;j<n;++j) printf("%u ",b[i][j]);
	printf("\n");
	}
return 0;
}