Блог пользователя Renyxa

Автор Renyxa, 10 лет назад, По-русски

Здравствуйте. Помогите пожалуйста решить эту задачу.

  • Задача 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;
}

  • Проголосовать: нравится
  • -16
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Тебе, как впрочем и мне, надо не о геометрии щас думать...