Cod sursa(job #1815792)

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


#include <stdlib.h>
#include <stdio.h>
#include <iostream>
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()
{
	FILE *f = NULL;
	FILE *g = NULL;
	
	f = fopen("fractal.in", "r");
	g = fopen("fractal.out", "w");
	fscanf_s(f, "%d %ld %ld", &k, &globalY, &globalX);
	
	
	powerK = 1 << k;

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

	fprintf(g, "%ld", rezultat);

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

}