Cod sursa(job #772715)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 30 iulie 2012 16:28:35
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#include <algorithm>
#include <list>

int hilb[16];

int calc_cadran(int *x, int *y, int ord) {

	int L = 1 << ord;
	if (*x <= L / 2 && *y <= L / 2) {
		int aux;
		aux = *x;
		*x = *y;
		*y = aux;
		return 1;
	}
	if (*x > L / 2 && *y <= L / 2) {
		*x -= L / 2;
		return 2;
	}
	if (*x > L / 2 && *y > L / 2) {
		*x -= L / 2;
		*y -= L / 2;
		return 3;
	}
	*y -= L / 2;
	int aux = *x;
	*x = L / 2 - *y + 1;
	*y = L / 2 - aux + 1;
	return 4;
}

int fractal(int x, int y, int ord) {

	if (ord == 1) {
		if (x == 1 && y == 1) {
			return 0;
		}
		if (x == 1 && y == 2) {
			return 3;
		}
		if (x == 2 && y == 1) {
			return 1;
		}
		if (x == 2 && y == 2) {
			return 2;
		}
	}
	int cadran = calc_cadran(&x, &y, ord);
	if (cadran == 1) {
		return fractal(x, y, ord - 1);
	}
	if (cadran == 2) {
		return hilb[ord - 1] + fractal(x, y, ord - 1) + 1;
	}
	if (cadran == 3) {
		return 2 * hilb[ord - 1] + fractal(x, y, ord - 1) + 2;
	}
	
	return 3 * hilb[ord - 1] + fractal(x, y, ord - 1) + 3;
}


int main() {
	FILE *f = fopen("fractal.in", "r");
	FILE *g = fopen("fractal.out", "w");

	hilb[0] = 0;
	int x, y, k;
	for (int i = 1; i < 16; i++) {
		hilb[i] = 4 * hilb[i - 1] + 3;
		fprintf(stderr, "%d ",hilb[i]);
	}
	fprintf(stderr, "\n");

	fscanf(f, "%d%d%d", &k, &x, &y);
	fprintf(g, "%d", fractal(y, x, k));
	fclose(f);
	fclose(g);

}