Cod sursa(job #376871)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 22 decembrie 2009 19:14:34
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <cstdlib>

#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define IN "fractal.in"
#define OUT "fractal.out"
#define II inline

int C[32],K,X,Y;

II void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d%d", &K,&Y,&X);
	FOR(i,1,K) C[i] = 4 * C[i-1] + 3; 
}

II void rotate90(int &X,int &Y,int Xmax,int Ymax,int semn)
{
	int x = X,y = Y;
	if(semn == -1)
	{
		X = Ymax - y + 1;
		Y = x;
	}
	else
	{
		X = y;
		Y = Xmax - x + 1;
	}
}

II int solve(int K,int X,int Y,int rez)
{
	if(K == 1)
	{
		if(X == 1 &&Y == 1)
			return rez;
		else if(X == 2 && Y == 1)
			return rez + 1;
		else if(X == 2 && Y == 2)
			return rez + 2;
		else
			return rez + 3;
	}
	--K;
	
	if(X <= (1<<K) && Y <= (1<<K) ) 
	{
		//rotate -90
		rotate90(X,Y,1<<K,1<<K,1); 
		return C[K] - solve(K,X,Y,rez);
	}
	if(Y <= (1<<K)) 
		return C[K] + 1 + solve(K,X - (1<<K),Y,rez);
	if(X > (1<<K))  
		return C[K] * 2 + 2 + solve(K,X - (1<<K),Y - (1<<K),rez);
	
	//rotate +90
	rotate90(X,Y -= (1<<K),1<<K,1<<K,-1);
	return C[K] * 3 + 3 + C[K] - solve(K,X,Y,rez);
}		

int main()
{
	scan();
	printf("%d\n",solve(K,X,Y,0) );
}