Cod sursa(job #1815802)

Utilizator andreibdAndrei Dan Buboi andreibd Data 25 noiembrie 2016 19:44:51
Problema Fractal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
// ConsoleApplication2.cpp : Defines the entry point for the console application.
//



#include <iostream>
#include <fstream>
using namespace std;
int k;
int powerK;
long int globalX, globalY;
int cadran;
long int level_steps;
long int rezultat = 0;
int quadr(int x, int y, int twoPow) {
	if (x <= twoPow && y <= twoPow)
		return 1;
	else if (x >= twoPow + 1 && y <= twoPow)
		return 2;
	else if (x >= twoPow + 1 && y >= twoPow + 1)
		return 3;
	else
		return 4;
}
void project(int x, int  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 - y + 1;
		globalX = (powerK >> 1) - x + 1;
		//printf("LA acest pas x este %d si powerK este %d \n", x,powerK);
		project(globalX, globalY, 1);

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

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

void result(int x, int y, long int 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);
	powerK = 1 << k;

	level_steps = maxSteps(k);
	result(globalX, globalY, powerK);
	g << rezultat;
	

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

}