Cod sursa(job #781116)

Utilizator aranhilChivu Stefan Iulian aranhil Data 23 august 2012 14:07:23
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<stdio.h>
#include<math.h>

int x, y, k, cadrane[] = {1, 4, 2, 3}, lungime;

void roteste_oglindit1() {
	int tmp = cadrane[1];
	cadrane[1] = cadrane[2];
	cadrane[2] = tmp;
}

void roteste_oglindit2() {
	int tmp = cadrane[0];
	cadrane[0] = cadrane[3];
	cadrane[3] = tmp;
}

void divide(int left, int right, int top, int bottom, int k) {
	printf("%d %d %d %d\n", cadrane[0],  cadrane[1],  cadrane[2],  cadrane[3]);
	if(k == 1) {
		if(left == x && top == y) { //cadranul stanga sus
			printf("stanga sus");
			lungime += cadrane[0] - 1;
		}
		else if(left == x && bottom == y) { //cadranul stanga jos
			printf("stanga jos");
			lungime += cadrane[2] - 1;
		}
		else if(right == x && top == y) { //cadranul dreapta sus
			printf("dreapta sus");
			lungime += cadrane[1] - 1;
		}
		else { //cadranul dreapta jos
			printf("dreapta jos");
			lungime += cadrane[3] - 1;
		}
	}
	else {
		int mx = (right + left - 1) / 2;
		int my = (bottom + top - 1) / 2;
		printf("%d %d\n", mx, my);
		int cadran;
		if(x <= mx && y <= my) { //cadranul stanga sus
			cadran = cadrane[0];
			right = mx;
			bottom = my;
			printf("1 %d\n", cadran);
		}
		else if(x <= mx && y > my) { //cadranul stanga jos
			cadran = cadrane[2];
			right = mx;
			top = my + 1;
			printf("2 %d\n", cadran);
		}
		else if(x > mx && y > my) { //cadranul dreapta jos
			cadran = cadrane[3];
			left = mx + 1;
			top = my + 1;
			printf("3 %d\n", cadran);
		}
		else { //cadranul dreapta sus
			cadran = cadrane[1];
			left = mx + 1;
			bottom = my;
			printf("4 %d\n", cadran);
		}
		if(cadran == 1) roteste_oglindit1();
		else if(cadran == 2) {
			lungime += pow(2, 2 * k - 2);
		}
		else if(cadran == 3) {
			lungime += 2 * pow(2, 2 * k - 2);
		}
		else if(cadran == 4) {
			roteste_oglindit2();
			lungime += 3 * pow(2, 2 * k - 2);
		}
		divide(left, right, top, bottom, k - 1);
	}
}

int main() {
	FILE *f = fopen("fractal.in", "r");
	FILE *g = fopen("fractal.out", "w");
	
	fscanf(f, "%d %d %d", &k, &x, &y);
	
	divide(1, pow(2, k), 1, pow(2, k), k);
	
	fprintf(g, "%d", lungime);
	
	fclose(f);
	fclose(g);
	return 0;
}