Cod sursa(job #833767)

Utilizator GodiesVlad Voicu Godies Data 13 decembrie 2012 00:17:11
Problema Fractal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 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)) {
		cout << "Cadran 4" << endl;
		return 4;
	}
	if ((x > val / 2) && (y <= val / 2)) {
		cout << "Cadran 1" << endl;
		return 1;
	}
	if ((x > val / 2) && (y > val / 2)) {
		cout << "Cadran 2" << endl;
		return 2;
	}
	if ((x <= val/ 2) && (y > val / 2)) {
		cout << "Cadran 3" << endl;
		return 3;
	}
	cout << "ABIS";
	return -1;
}

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

int count(int k, int x, int y)
{
	cout << "K: " << k << " X: " << x << " Y: " << y << endl;
	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;
	}
	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 + 1) / 2);
	} else if (cadran(k, x, y) == 2) {
		return 2 + 2*count(k - 1) + count(--k, (x + 1) / 2, (y + 1) / 2);
	} else if (cadran(k, x, y) == 1) {
		long long val = pow(2.0, k - 1);
		x = x / 2;
		return 3 + 3*count(k - 1) + count(--k, val - y + 1, (val + 1 - x));
	}
	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, &x, &y);
	fprintf(g, "%d", count(k, x, y));
	/* cout << count(3, 5, 1);
	cout << endl; */
	return 0;
}