1618 - Colisão

Com algumas comparações, podemos saber se o robô invadiu nosso espaço.

Descrição

Solução

O problem setter deste problema fez um excelente trabalho em nos trazer uma ilustração que nos explica o problema a ser resolvido e nos dá uma luz em como resolvê-lo. Pelo desenho, podemos perceber as seguintes coordenadas dos pontos apresentados:

Pontos

Coordenadas

A

(4, 4)

B

(9, 4)

C

(9, 8)

D

(4, 8)

Robô

(6, 5)

Os pontos A, B, C e D nem sempre formam um retângulo certinho, é nosso papel avaliar se é possível que o robô esteja dentro seguindo todas as regras abaixo. Dessa maneira, também podemos avaliar ao mesmo tempo se os pontos formam um retângulo ou não.

Com isso, para o robô estar dentro do espaço delimitado por esses pontos, vamos pensar separadamente: primeiro na coordenada x do robô e depois na coordenada y.

Pela coordenada x do robô, podemos ver que tal coordenada precisa estar entre a coordenada x de A e D e a coordenada x de B e C. Se essa coordenada for menor que a de A ou a de D, o robô sempre está do lado de fora. Pelo mesmo raciocínio, se essa coordenada for maior que a de B ou a de C, o robô também está do lado de fora.

Pela coordenada y do robô, o raciocínio é semelhante, onde tal coordenada precisa estar entre a coordenada y de A e B e a coordenada y de D e C.

Em termos matemáticos, vamos testar

AxRx,DxRx,RxBx,RxCxeAyRy,ByRy,RyCy,RyDyA_{x} \leq R_{x}, D_{x} \leq R_{x}, R_{x} \leq B_{x}, R_{x} \leq C_{x} \\ \text{e} \\ A_{y} \leq R_{y}, B_{y} \leq R_{y}, R_{y} \leq C_{y}, R_{y} \leq D_{y}
#include <stdio.h>

int main()
{
    int N, Ax, Ay, Bx, By, Cx, Cy, Dx, Dy, Rx, Ry;

    scanf("%d", &N);

    for (int i = 0; i < N; ++i)
    {
        scanf("%d %d %d %d %d %d %d %d %d %d", &Ax, &Ay, &Bx, &By, &Cx, &Cy, &Dx, &Dy, &Rx, &Ry);

        printf("%d\n", Ax <= Rx && Dx <= Rx &&
                           Rx <= Bx && Rx <= Cx &&
                           Ay <= Ry && By <= Ry &&
                           Ry <= Cy && Ry <= Dy);
    }

    return 0;
}

Last updated