Cod sursa(job #1626139)

Utilizator emyll96Constantinescu Emil emyll96 Data 2 martie 2016 22:49:33
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
int nr_laturi(int k)
{
	int i,nr=0;
	for(i=1;i<=k;i++)
	{
		nr=nr*4+3;
	}
	return nr;
}
int nr_puncte(int k)
{
	int i=0,nr=1;
	for(i=1;i<=k;i++)
	{
		nr=nr*2;
	}
	return nr;
}
int cadran(int x,int y,int k)
{
	if(x<=k/2&&y<=k/2)return 1;
	else 
		if(x<=k/2&&y>k/2)return 2;
		else
			if(x>k/2&&y<=k/2)return 4;
			else return 3;
}
void transf(int&x,int&y,int cad,int l)
{
	int xp,yp;
	if (cad==1)
	{
		xp=x;
		yp=y;
		x=l/2-yp+1;
		y=xp;
	}
		if (cad==2)
		{
			y=y-l/2;
		}
		else 
			if(cad==3)
		{
			x=x-l/2;
			y=y-l/2;
		}
			else if(cad==4)
			{
				xp=x;
				yp=y;
				x=yp;
				y=l-xp+1;
			}
}
int calcul(int x,int y,int k)
{
	int cadr,lat;
	if(k==0)return 0;
	lat=nr_laturi(k);
	cadr=cadran(x,y,nr_puncte(k));
	transf(x,y,cadr,nr_puncte(k));
	if(cadr==2||cadr==3)return (cadr-1)*nr_laturi(k-1)+cadr-1+calcul(x,y,k-1);
	else return (cadr-1)*nr_laturi(k-1)+cadr-1+nr_laturi(k-1)-calcul(x,y,k-1);
}
int main()
{
	FILE *A,*B;
	A=fopen("fractal.in","r");
	B=fopen("fractal.out","w");
	int x,y,k;
	fscanf(A,"%d%d%d",&k,&x,&y);
	fprintf(B,"%d",calcul(x,y,k));
	fclose(A);
	fclose(B);
}