Cod sursa(job #125302)

Utilizator bazubBazu Bogdan bazub Data 20 ianuarie 2008 12:27:53
Problema Piese Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 9-a Marime 1.12 kb
#include<fstream.h>
long m,n,i,p,minmn,a[50][50],j,cate,min,q,w;
int minim(int x,int y){
	if(x>y)
		return y;
	return x;
}
int umpd(int n,int m,int dul,int duc);
int umpj(int n,int m,int dul,int duc);
int main(){
ifstream fin("piese.in");
ofstream fout("piese.out");
fin>>q>>w;
minmn=minim(q,w);
p=1;
cate=1;
for(i=2;i*p<=minmn;p=p*i) ;
for(i=1;i<=p;i++)
	for(j=1;j<=p;j++)
		a[i][j]=1;
if(p<w)umpd(q,w-p,1,p+1);
else umpj(q-p,w,p+1,1);

fout<<a[q][w]<<'\n';
for(i=1;i<=q;i++){
	for(j=1;j<=w;j++)
		fout<<a[i][j]<<' ';
	fout<<'\n';
}

return 0;
}
int umpj(int n,int m,int dul,int duc){
	minmn=minim(n,m);
	p=1;
	cate++;
	for(i=2;i*p<=minmn;p=p*i) ;
	for(i=dul;i<p+dul;i++)
		for(j=duc;j<p+duc;j++)
			a[i][j]=cate;
	umpd(n,m-p,dul,duc+p);

}
int umpd(int n,int m,int dul,int duc){
	minmn=minim(n,m);
	int i,j,p,l=0;
	p=1;
	cate++;
	for(i=2;i*p<=minmn;p=p*i) ;
	for(i=dul;i<p+dul;i++)
		for(j=duc;j<p+duc;j++)
			a[i][j]=cate;
	if(i>q+1 || j>w+1)
		return 0;
	if(p+duc-1<w)
		umpd(n,m-p,dul,duc+p);
	else{
		while(a[i][1]!=0) i++;
		while(a[1][j]!=0) j++;
		umpj(q-i+1,w,i,1);
	}
}