Cod sursa(job #66263)

Utilizator scapryConstantin Berzan scapry Data 17 iunie 2007 11:26:25
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <assert.h>
#include <stdio.h>

enum { maxsize = 16 };

int calc(int size, int row, int col)
{
	printf("calc size %d row %d col %d\n", size, row, col);

	assert(size >= 0 && size < maxsize);
	assert(row >= 0 && row < (1 << size));
	assert(col >= 0 && col < (1 << size));

	if(size == 0) return 0; //we're there.

	int sub_value = 1 << (2 * (size - 1));
	int sub_size = 1 << (size - 1);
	printf("sub size %d value %d\n", sub_size, sub_value);

	if(row < sub_size && col < sub_size) //first "quadrant" (0, 0)
		return calc(size - 1, col, row);                                             //col & row reversed
	else if(row >= sub_size && col < sub_size) //second "quadrant" (1, 0)
		return sub_value + calc(size - 1, row - sub_size, col);
	else if(row >= sub_size && col >= sub_size) //third "quadrant" (1, 1)
		return 2 * sub_value + calc(size - 1, row - sub_size, col - sub_size);
	else if(row < sub_size && col >= sub_size) //forth "quadrant" (0, 1)
		return 3 * sub_value + calc(size - 1, sub_size - 1 - (col - sub_size),
				                      sub_size - 1 - row);                   //col & row reversed
	else
		assert(false);
}

int main()
{
	int size, row, col, ans;
	FILE *f = fopen("fractal.in", "r");
	if(!f) return 1;

	fscanf(f, "%d%d%d", &size, &col, &row);
	col--; row--;

	fclose(f);
	f = fopen("fractal.out", "w");
	if(!f) return 1;

	ans = calc(size, row, col);

	fprintf(f, "%d\n", ans);
	fclose(f);
	return 0;
}