Здравствуйте. Помогите пожалуйста решить эту задачу.
- Задача A-Kvadratlar
- Ограничение времени: 1 с
- Ограничение памяти: 64 M
- На плоскости заданы N квадратов, стороны которых параллельны осям координат. Координаты всех углов квадратов- целые числа, и сами квадраты не касаются и пересекаются.
- Необходимо подсчитать число квадратов, видимых из начала координат (точки (0, 0) ).
- Квадрат видим из точки O, если существуют две различные точки А и B на одной из его сторон таких, что треугольник OAB не имеет никаких общих точек с любым другим квадратом.
- Формат входных данных
- Первая строка содержит единственное число N ( 1 ≤ N ≤ 1000), количество квадратов. Каждая из следующих N строк описывает один квадрат целыми числами X, Y и L (1 ≤ X, Y, L ≤ 10000), разделенными одним пробелом. X и Y — координаты левого нижнего угла квадрата и L — длина стороны квадрата.
- Формат результата
- Первая и единственная строка должна содержать количество квадратов, которые видимы из начала координат.
Входные данные Результат работы
3
2 6 3
1 4 1
3 4 1 3
4
1 2 1
3 1 1
2 4 2
3 7 1 2
Я попробовал полным перебором, но не получается, ничего другого в голову не приходит:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define uLL unsigned long long
#define pb push_back
#define PI 3.14159265359
const double EPS = 1e-9;
inline double inter(double x1, double y1,double x2, double y2,double x3, double y3)
{
return (x2-x1) * (y3-y1) - (y2-y1) * (x3-x1);
}
inline bool intersect_1(double a, double b, double c, double d)
{
if(a>b) swap(a, b);
if(c>d) swap(c, d);
return max(a, c) <= min(b, d);
}
inline bool intersect(double x1, double y1,double x2, double y2,double x3, double y3, double x4, double y4)
{
return intersect_1(x1, x2, x3, x4)
&& intersect_1(y1, y2, y3, y4)
&& inter(x1, y1, x2, y2, x3, y3) * inter(x1, y1, x2, y2, x4, y4) <= 0 // ! * !
&& inter(x3, y3, x4, y4, x2, y2) * inter(x3, y3, x4, y4, x1, y1) <= 0; // ! * !
}
struct Sqr
{
struct
{
double x, y;
} P1;
struct
{
double x, y;
} P2;
struct
{
double x, y;
} P3;
};
int main()
{
int n;
int amount = 0;
cin >> n;
Sqr *S = new Sqr[n+2];
for(int i = 1; i <= n; ++i)
{
double x, y, l;
cin >> x >> y >> l;
S[i].P1.x = x;
S[i].P1.y = y+l;
S[i].P2.x = x;
S[i].P2.y = y;
S[i].P3.x = x+l;
S[i].P3.y = y;
/*cout << S[i].P1.x << " " << S[i].P1.y << endl;
cout << S[i].P2.x << " " << S[i].P2.y << endl;
cout << S[i].P3.x << " " << S[i].P3.y << endl;*/
}
for(int i = 1; i <= n; ++i)
{
bool q = 0;
for(double y = S[i].P1.y; y >= S[i].P2.y; y -= 0.5)
{
q = 0;
for(int j = 1; j <= n; ++j)
{
if(i != j)
{
if(intersect(S[i].P1.x, y, 0.0, 0.0, S[j].P1.x, S[j].P1.y, S[j].P2.x, S[j].P2.y) == 1)
{
q = 1;
}
if(intersect(S[i].P1.x, y, 0.0, 0.0, S[j].P2.x, S[j].P2.y, S[j].P3.x, S[j].P3.y) == 1)
{
q = 1;
}
}
}
if(q == 0)
{
//cout << "1 i = " << i << endl;
++amount;
break;
}
}
if(q == 0)
continue;
for(double x = S[i].P2.x; x <= S[i].P3.x; x += 0.5)
{
q = 0;
for(int j = 1; j <= n; ++j)
{
if(i != j)
{
if(intersect(x, S[i].P2.y, 0.0, 0.0, S[j].P1.x, S[j].P1.y, S[j].P2.x, S[j].P2.y) == 1)
{
q = 1;
}
if(intersect(x, S[i].P2.y, 0.0, 0.0, S[j].P2.x, S[j].P2.y, S[j].P3.x, S[j].P3.y) == 1)
{
q = 1;
}
}
}
if(q == 0)
{
//cout << "2 i = " << i << endl;
++amount;
break;
}
}
}
cout << amount << endl;
return 0;
}
Тебе, как впрочем и мне, надо не о геометрии щас думать...