Pagini recente » Cod sursa (job #2693947) | Cod sursa (job #11102) | Cod sursa (job #2009146) | Cod sursa (job #451549) | Cod sursa (job #73517)
Cod sursa(job #73517)
#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;
}