Cod sursa(job #1815841)

Utilizator andreibdAndrei Dan Buboi andreibd Data 25 noiembrie 2016 20:24:36
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
// ConsoleApplication2.cpp : Defines the entry point for the console application.
//



#include <iostream>
#include <fstream>
using namespace std;
int k;
long long powerK;
long long globalX, globalY;
int cadran;
long long level_steps;
long long rezultat = 0;
int quadr(long long x, long long y, long long twoPow) {
	if ((x <= twoPow) && (y <= twoPow))
		return 1;
	 if ((x >= (twoPow + 1)) && (y <= twoPow))
		return 2;
     if ((x >= (twoPow + 1)) && (y >= (twoPow + 1)))
		return 3;
	if((x <= twoPow) && (y>= (twoPow+1)))
		return 4;
}
void project(long  long x, long long y, int cadran) {
	if (cadran == 1) {
		globalY = x;
		globalX = y;
		//printf("Ma aflu in cadranul %d \n", cadran);
	}
	if (cadran == 2) {
		globalX = x - (powerK >> 1);
		globalY = y;
		//printf("Ma aflu in cadranul %d \n", cadran);
	}
	if (cadran == 3) {
		globalX = x - (powerK >> 1);
		globalY = y - (powerK >> 1);
		//printf("Ma aflu in cadranul %d \n", cadran);
	}
	if (cadran == 4) {

		globalY =  (powerK >> 1) - x + 1;
		globalX =  powerK - y + 1;
		//printf("LA acest pas x este %d si powerK este %d \n", x,powerK);
		

		//printf("Ma aflu in cadranul %d \n", cadran);
	}

}
long long maxSteps(int n) {
	return (1 << 2 * (n - 1)) - 1;
}

void result(long long x, long  long y, long long putere) {
	//printf("Punctul [%d,%d]\n", x, y);
	if (putere == 2) {
		if (x == 1 && y == 1)
			rezultat += 0;
		else
			if (x == 2 && y == 1)
				rezultat += 1;
			else
				if (x == 2 && y == 2)
					rezultat += 2;
				else
					if (x == 1 && y == 2)
						rezultat += 3;
	}
	else
	{
		cadran = quadr(x, y, (powerK >> 1));
		//printf("Ma aflu in cadranul %d si puterea e %d\n", cadran,powerK);
		project(x, y, cadran);


		rezultat += (cadran - 1)*(level_steps + 1);
		//printf("%d\n", (cadran - 1)*(level_steps + 1));
		level_steps = level_steps >> 2;
		powerK = powerK >> 1;
		result(globalX, globalY, powerK);

	}
}
int main()
{
	
	

	ifstream f("fractal.in");
	ofstream g("fractal.out");
	
	f>>k>>globalY>>globalX;

	//printf("%d %ld %ld",k,globalX,globalY);
	//k = 10;
	powerK = 1 << k;
	//printf("%d\n", maxSteps(k + 1));
	level_steps = maxSteps(k);
	result(globalX, globalY, powerK);
	g << rezultat;
	

	//printf("%ld \n", rezultat);

}