Quadrant Selection

Problema original: Kattis — Quadrant Selection

Si buscas la solución de Quadrant Selection de Kattis, aquí encontrarás una explicación clara y un código en C++ para resolver el problema de la forma más eficiente.

time limit per test: 1 s | memory limit per test: 1024 mB

Dado un punto (x, y) en el plano cartesiano donde ninguna de las dos coordenadas es cero, determina en cuál de los cuatro cuadrantes se encuentra el punto.

Input

La entrada contiene una única línea con dos enteros x e y separados por espacio, donde x ≠ 0 e y ≠ 0.

Output

Imprime el cuadrante en el que se encuentra el punto: Q1, Q2, Q3 o Q4.

Examples

InputOutput
2 31
-1 72
-4 -53
3 -24

Observación clave

Los cuatro cuadrantes del plano cartesiano se definen exclusivamente por el signo de las coordenadas:

Cuadrantexy
Q1> 0> 0
Q2< 0> 0
Q3< 0< 0
Q4> 0< 0

Como el enunciado garantiza que x ≠ 0 e y ≠ 0, no existe ningún caso borde: cada punto cae exactamente en uno de los cuatro cuadrantes. Basta verificar el signo de cada coordenada para dar la respuesta.

Estrategia de implementación

Existen varias formas equivalentes de implementarlo en C++:

  1. Cuatro condiciones explícitas (if-else if): la más legible y directa.
  2. Indexado con aritmética de booleanos: construimos un índice a partir de x > 0 e y > 0 y buscamos en un arreglo predefinido.
  3. Expresión con operadores ternarios anidados: una sola línea que concatena el número de cuadrante directamente.

Todas tienen la misma complejidad O(1), pero el enfoque con arreglo indexado es el más interesante, ya que aprovecha que en C++ los booleanos true/false se convierten implícitamente a 1/0 al usarse en aritmética.

Ejemplo paso a paso

Para la entrada (-4, -5):

VerificaciónResultado
x = -4 → negativox < 0
y = -5 → negativoy < 0
Ambas negativasQ3

Para la entrada (3, -2):

VerificaciónResultado
x = 3 → positivox > 0
y = -2 → negativoy < 0
x positivo, y negativoQ4

¿Por qué el indexado por booleanos es elegante aquí?

La expresión x > 0 en C++ evalúa a true o false, y al convertirse a entero da 1 o 0. Combinando (x > 0) e (y > 0) podemos construir un índice de 2 bits (0 a 3) que cubre exactamente las cuatro combinaciones posibles y buscarlo directamente en un arreglo, evitando cadenas de if-else if:

string cuadrantes[2][2] = { {"3", "2"}, // y < 0 : x < 0 -> Q3, x > 0 -> Q4 (fila y>0=false) {"4", "1"}, // y > 0 : x < 0 -> Q2, x > 0 -> Q1 (fila y>0=true) };

Para no complicar la lectura del arreglo, en la solución final se prefiere indexarlo directamente como cuadrantes[y > 0][x > 0], de modo que cada celda es una transcripción directa de la tabla de cuadrantes.

Complejidad

  • Tiempo: O(1) — una única comparación de signos, independiente del valor de las coordenadas.
  • Espacio: O(1) — el arreglo tiene exactamente cuatro entradas fijas; no crece con la entrada.

Solución

Intenta resolver el ejercicio por tu cuenta antes de ver la solución.

C++ (Sin comentarios)
#include <bits/stdc++.h> using namespace std; int main() { int x, y; cin >> x >> y; string cuadrantes[2][2] = { {"3", "4"}, {"2", "1"} }; cout << cuadrantes[y > 0][x > 0] << "\n"; return 0; }
C++ (Con comentarios)
#include <bits/stdc++.h> using namespace std; int main() { int x, y; cin >> x >> y; // Tabla indexada por (y > 0, x > 0): // fila 0 (y < 0): columna 0 (x < 0) -> Q3, columna 1 (x > 0) -> Q4 // fila 1 (y > 0): columna 0 (x < 0) -> Q2, columna 1 (x > 0) -> Q1 string cuadrantes[2][2] = { {"3", "4"}, {"2", "1"} }; // x > 0 y y > 0 se convierten implícitamente a 1 o 0, // sirviendo como índices del arreglo. // La garantía x != 0 e y != 0 asegura que el índice siempre es válido. cout << cuadrantes[y > 0][x > 0] << "\n"; return 0; }

You are welcome to share your solution in another programming language