Cod sursa(job #178010)

Utilizator varuvasiTofan Vasile varuvasi Data 13 aprilie 2008 23:34:35
Problema Fractal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#define maxn 16

int K, _x, _y, res;
int c1[4] = {1, 4, 3, 2}, c2[4] = {1, 2, 3, 4}, c3[] = {1, 2, 3, 4}, c4[] = {3, 2, 1, 4};
int v[4] = {1, 2, 3, 4};
int pow2[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768};
FILE *fin = fopen("fractal.in", "rt"), *fout = fopen("fractal.out", "wt");
void rec(int k, int x, int y)
{
	int i;
	fprintf(fout, "%d %d %d\n", k, x, y);
	fprintf(fout, "%d %d %d %d\n", v[0], v[1], v[2], v[3]);
	if (k == 0) { res++; return; }
	if (x <= pow2[k - 1] && y <= pow2[k - 1])
	{
		res += (v[0] - 1) * pow2[k];
		for (i = 0; i < 4; i++) v[c1[i] - 1] = i + 1;
		rec(k - 1, x, y);
	}
	if (x > pow2[k - 1] && y <= pow2[k - 1])
	{
		res += (v[1] - 1) * pow2[k];
		for (i = 0; i < 4; i++) v[c2[i] - 1] = i + 1;
		rec(k - 1, x - pow2[k - 1], y);
	}
	if (x <= pow2[k - 1] && y > pow2[k - 1])
	{
		res += (v[2] - 1) * pow2[k];
		for (i = 0; i < 4; i++) v[c3[i] - 1] = i + 1;
		rec(k - 1, x, y - pow2[k - 1]);
	}
	if (x > pow2[k - 1] && y > pow2[k - 1])
	{
		res += (v[3] - 1) * pow2[k];
		for (i = 0; i < 4; i++) v[c4[i] - 1] = i + 1;
		rec(k - 1, x - pow2[k - 1], y - pow2[k - 1]);
	}
}

int main()
{
	fscanf(fin, "%d %d %d", &K, &_x, &_y);
	int aux = _x, _x = _y; _y = aux;
	rec(K, _x, _y);
	fprintf(fout, "%d", res - 1);
	fclose(fin), fclose(fout);
	return 0;
}