Cod sursa(job #329928)

Utilizator cotofanaCotofana Cristian cotofana Data 8 iulie 2009 02:50:42
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>

int k, x, y, sol, xs, ys, xf, yf, d;
const int v[4][4]={0, 1, 3, 2, 2, 1, 3, 0, 0, 3, 1, 2, 2, 3, 1, 0};
/*
d==0 0 1
     3 2

d==1 2 1
     3 0

d==2 0 3
     1 2

d==3 2 3
     1 0
*/

void res(int lvl) {
	int mx, my;
	if (!lvl) return;
	mx=(xs+xf)/2;
	my=(ys+yf)/2;
	if (x<=mx && y<=my) {
		sol+=v[d][0]*(1<<(lvl-1))*(1<<(lvl-1));
		xf=mx, yf=my;
		if (!d) d=2;
		else if (d==1) d=1; 
		else if (d==2) d=0;
		else if (d==3) d=3;
		res(lvl-1);
	}
	else if (x<=mx && y>my) {
		sol+=v[d][1]*(1<<(lvl-1))*(1<<(lvl-1));
		xf=mx, ys=my+1;
		if (!d) d=0;
		else if (d==1) d=1;
		else if (d==2) d=3;
		else if (d==3) d=2;
		res(lvl-1);
	}
	else if (x>mx && y<=my) {
		sol+=v[d][2]*(1<<(lvl-1))*(1<<(lvl-1));
		xs=mx+1, yf=my;
		if (!d) d=1;
		else if (d==1) d=0;
		else if (d==2) d=2;
		else if (d==3) d=3;
		res(lvl-1);
	}
	else {
		sol+=v[d][3]*(1<<(lvl-1))*(1<<(lvl-1));
		xs=mx+1, ys=my+1;
		if (!d) d=0;
		else if (d==1) d=3;
		else if (d==2) d=2;
		else if (d==3) d=1;
		res(lvl-1);
	}
}

int main() {
	freopen("fractal.in", "r", stdin);
	freopen("fractal.out", "w", stdout);
	
	scanf("%d %d %d\n", &k, &x, &y);
	xs=ys=1;
	xf=yf=1<<k;
	sol=d=0;
	
	res(k);
	
	printf("%d\n", sol);
	
	return 0;
}