Cod sursa(job #833780)

Utilizator GodiesVlad Voicu Godies Data 13 decembrie 2012 01:02:39
Problema Fractal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

int cadran(int k, int x, int y)
{
	long long val = pow(2.0, k);
	if ((x <= val / 2) && (y <= val / 2)) {
		return 4;
	}
	if ((x > val / 2) && (y <= val / 2)) {
		return 1;
	}
	if ((x > val / 2) && (y > val / 2)) {
		return 2;
	}
	if ((x <= val / 2) && (y > val / 2)) {
		return 3;
	}
	return -1;
}

int count(int k)
{
	if (k == 1) {
		return 3;
	}
	return 4*count(--k) + 3;
}

int count(int k, int x, int y)
{
	if (k == 1) {
		if (x == 1 && y == 1) {
			return 0;
		}
		if (x == 1 && y == 2) {
			return 1;
		}
		if (x == 2 && y == 1) {
			return 3;
		}
		return 2;
	}
	long long val = pow(2.0, k - 1);
	if (cadran(k, x, y) == 4) {
		return count(--k, y, x);
	} else if (cadran(k, x, y) == 3) {
		return 1 + count(k - 1) + count(--k, x, y - val);
	} else if (cadran(k, x, y) == 2) {
		return 2 + 2*count(k - 1) + count(--k, x - val, y - val);
	} else if (cadran(k, x, y) == 1) {
		return 3 + 3*count(k - 1) + count(--k, val - y + 1, (val - (x - val) + 1));
	}
	return -1;
}

int main()
{
	FILE *f = fopen("fractal.in", "rt");
	FILE *g = fopen("fractal.out", "wt");
	int x, y, k;
	fscanf (f, "%d%d%d", &k, &y, &x);
	fprintf(g, "%d", count(k, x, y));
	return 0;
}