Cod sursa(job #73517)

Utilizator scapryConstantin Berzan scapry Data 19 iulie 2007 09:54:23
Problema Triang Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <cassert>
#include <cstdio>
#include <cmath>
#include <set>
using namespace std;

#define printf(...) /*don't hold me back I want to fall*/;

enum { maxpoints = 1501, mult_prec = 1000, maxcoord = 20002, coord_bias = 10001 };

typedef pair<int, int> Point;
set<Point> is;

double sin60, cos60, sin_60, cos_60;

int points;
int point[maxpoints][2];
int ans;

void init()
{
	sin60 = sin(M_PI / 3);
	cos60 = cos(M_PI / 3);

	sin_60 = sin(-M_PI / 3);
	cos_60 = cos(-M_PI / 3);
}

void search(const Point &p)
{
	int a, b;
	Point q;

	for(a = -1; a <= 1; a++)
		for(b = -1; b <= 1; b++)
		{
			q.first = p.first + a;
			q.second = p.second + b;

			if(is.find(q) != is.end())
			{
				printf("found %d %d\n", q.first, q.second);
				ans++;
			}
		}
}

void go()
{
	int i, j;
	double oldx, oldy;
	double x, y;
	Point p;

	init();

	for(i = 0; i < points; i++)
		for(j = i + 1; j < points; j++)
		{
			printf("i %d (%d %d) j %d (%d %d)\n", i, point[i][0], point[i][1],
					j, point[j][0], point[j][1]);

			oldx = point[j][0] - point[i][0];
			oldy = point[j][1] - point[i][1];

			//forward 60deg
			x = oldx * cos60 - oldy * sin60;
			y = oldx * sin60 + oldy * cos60;
			p.first = int(round(x));
			p.second = int(round(y));
			printf("forward %d %d\n", p.first, p.second);
			search(p);

			//backward 60deg
			x = oldx * cos_60 - oldy * sin_60;
			y = oldx * sin_60 + oldy * cos_60;
			p.first = int(round(x));
			p.second = int(round(y));
			printf("backward %d %d\n", p.first, p.second);
			search(p);

			printf("\n");
		}

	printf("pre ans %d\n", ans);
	assert(ans % 3 == 0);
	ans /= 3;
}

int main()
{
	int i;
	double tmp;
	FILE *f = fopen("triang.in", "r");
	if(!f) return 1;

	fscanf(f, "%d", &points);
	for(i = 0; i < points; i++)
	{
		fscanf(f, "%lf", &tmp);
		//tmp += coord_bias;
		point[i][0] = int(round(tmp * mult_prec));

		fscanf(f, "%lf", &tmp);
		//tmp += coord_bias;
		point[i][1] = int(round(tmp * mult_prec));

		printf("point %d: %d %d\n", i, point[i][0], point[i][1]);

		is.insert(Point(point[i][0], point[i][1]));
	}

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

	go();

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