Cod sursa(job #526591)

Utilizator cat_red20Vasile Ioana cat_red20 Data 28 ianuarie 2011 19:10:26
Problema Piese Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#include<stdlib.h>
int a[501][501],m,n,nr,v[10];
FILE *fin,*fout;

int cautare(int x){
int p,u,m;
p=1;
u=8;
while(p<=u){
	m=(p+u)/2;
	if(v[m]<x)
		p=m+1;
	if(v[m]>x)
		u=m-1;
	if(v[m]==x)
		return v[m];
}
return v[u];
}

void suprafata(int i,int j,int x,int y){
int lung,lat,l,min,k,q;
if(i<x && j<y){
	
	nr++;
	lung=abs(i-x)+1;
	lat=abs(j-y)+1;
	min=(lung+lat-abs(lung-lat))/2;
	l=cautare(min);
	for(k=i;k<=i+l-1;k++){
		for(q=j;q<=j+l-1;q++){
			a[k][q]=nr;
		}
	}
	suprafata(i,j+l,i+l-1,y);
	suprafata(i+l,j,x,y);
}
}

int main(){
fin=fopen("piese.in","r");
fout=fopen("piese.out","w");
fscanf(fin,"%d %d",&m,&n);
v[1]=1;
int i,j;
for(i=2;v[i]<500;i++){
	v[i]=v[i-1]*2;
}
suprafata(1,1,m,n);

for(i=1;i<=m;i++){
	for(j=1;j<=n;j++){
		if(a[i][j]==0){
			nr++;
			a[i][j]=nr;
		}
	}
}

fprintf(fout,"%d\n",nr);
for(i=1;i<=m;i++){
	for(j=1;j<=n;j++){
		fprintf(fout,"%d ",a[i][j]);
	}
	fprintf(fout,"\n");
}
return 0;}