Número de puntos integrales entre dos puntos

Dados dos puntos p (x1, y1) y q (x2, y2), calcula el número de puntos integrales que se encuentran en la línea que los une.
Ejemplo: si los puntos son (0, 2) y (4, 0), entonces el número de puntos integrales que se encuentran en él es solo uno y es (2, 1). 
De manera similar, si los puntos son (1, 9) y (8, 16), los puntos integrales que se encuentran sobre él son 6 y son (2, 10), (3, 11), (4, 12), (5, 13 ), (6, 14) y (7, 15). 
  
 

Le recomendamos encarecidamente que haga clic aquí y lo practique antes de pasar a la solución.

 
Enfoque simple 
Comience desde cualquiera de los puntos dados, llegue al otro punto final usando bucles. Para cada punto dentro del ciclo, verifica si se encuentra en la línea que une dos puntos dados. En caso afirmativo, aumente la cuenta en 1. La complejidad del tiempo para este enfoque será O(min(x2-x1, y2-y1)).
  
Enfoque óptimo 

1. If the edge formed by joining p and q is parallel 
   to the X-axis, then the number of integral points 
   between the vertices is : 
        abs(p.y - q.y)-1

2. Similarly if edge is parallel to the Y-axis, then 
   the number of integral points in between is :
    abs(p.x - q.x)-1

3. Else, we can find the integral points between the
   vertices using below formula:
     GCD(abs(p.x - q.x), abs(p.y - q.y)) - 1

¿Cómo funciona la fórmula GCD?  
La idea es encontrar la ecuación de la línea en su forma más simple, es decir, en la ecuación ax + by +c, los coeficientes a, b y c se convierten en coprimos. Podemos hacer esto calculando el MCD (máximo común divisor) de a, b y c y convertir a, b y c en la forma más simple. 
Entonces, la respuesta será (diferencia de coordenadas y) dividida por (a) – 1. Esto se debe a que después de calcular ax + by + c = 0, para diferentes valores de y, x será el número de valores de y que son exactamente divisibles por una.
A continuación se muestra la implementación de la idea anterior.
 

C++

// C++ code to find the number of integral points
// lying on the line joining the two given points
#include <iostream>
#include <cmath>
using namespace std;
 
// Class to represent an Integral point on XY plane.
class Point
{
public:
    int x, y;
    Point(int a=0, int b=0):x(a),y(b) {}
};
 
// Utility function to find GCD of two numbers
// GCD of a and b
int gcd(int a, int b)
{
    if (b == 0)
       return a;
    return gcd(b, a%b);
}
 
// Finds the no. of Integral points between
// two given points.
int getCount(Point p, Point q)
{
    // If line joining p and q is parallel to
    // x axis, then count is difference of y
    // values
    if (p.x==q.x)
        return abs(p.y - q.y) - 1;
 
    // If line joining p and q is parallel to
    // y axis, then count is difference of x
    // values
    if (p.y == q.y)
        return abs(p.x-q.x) - 1;
 
    return gcd(abs(p.x-q.x), abs(p.y-q.y))-1;
}
 
// Driver program to test above
int main()
{
    Point p(1, 9);
    Point q(8, 16);
 
    cout << "The number of integral points between "
         << "(" << p.x << ", " << p.y << ") and ("
         << q.x << ", " << q.y << ") is "
         << getCount(p, q);
 
    return 0;
}

Java

// Java code to find the number of integral points
// lying on the line joining the two given points
 
class GFG
{
 
// Class to represent an Integral point on XY plane.
static class Point
{
    int x, y;
    Point(int a, int b)
    {
        this.x = a;
        this.y = b;
    }
};
 
// Utility function to find GCD of two numbers
// GCD of a and b
static int gcd(int a, int b)
{
    if (b == 0)
    return a;
    return gcd(b, a % b);
}
 
// Finds the no. of Integral points between
// two given points.
static int getCount(Point p, Point q)
{
    // If line joining p and q is parallel to
    // x axis, then count is difference of y
    // values
    if (p.x == q.x)
        return Math.abs(p.y - q.y) - 1;
 
    // If line joining p and q is parallel to
    // y axis, then count is difference of x
    // values
    if (p.y == q.y)
        return Math.abs(p.x - q.x) - 1;
 
    return gcd(Math.abs(p.x - q.x), Math.abs(p.y - q.y)) - 1;
}
 
// Driver program to test above
public static void main(String[] args)
{
    Point p = new Point(1, 9);
    Point q = new Point(8, 16);
 
    System.out.println("The number of integral points between "
        + "(" + p.x + ", " + p.y + ") and ("
        + q.x + ", " + q.y + ") is "
        + getCount(p, q));
}
}
 
// This code contributed by Rajput-Ji

Python3

# Python3 code to find the number of
# integral points lying on the line
# joining the two given points
 
# Class to represent an Integral point
# on XY plane.
class Point:
     
    def __init__(self, a, b):
        self.x = a
        self.y = b
 
# Utility function to find GCD
# of two numbers GCD of a and b
def gcd(a, b):
 
    if b == 0:
        return a
    return gcd(b, a % b)
 
# Finds the no. of Integral points
# between two given points.
def getCount(p, q):
 
    # If line joining p and q is parallel
    # to x axis, then count is difference
    # of y values
    if p.x == q.x:
        return abs(p.y - q.y) - 1
 
    # If line joining p and q is parallel
    # to y axis, then count is difference
    # of x values
    if p.y == q.y:
        return abs(p.x - q.x) - 1
 
    return gcd(abs(p.x - q.x),
               abs(p.y - q.y)) - 1
 
# Driver Code
if __name__ == "__main__":
 
    p = Point(1, 9)
    q = Point(8, 16)
 
    print("The number of integral points",
          "between ({}, {}) and ({}, {}) is {}" .
           format(p.x, p.y, q.x, q.y, getCount(p, q)))
 
# This code is contributed by Rituraj Jain

C#

// C# code to find the number of integral points
// lying on the line joining the two given points
using System;
 
class GFG
{
 
// Class to represent an Integral point on XY plane.
public class Point
{
    public int x, y;
    public Point(int a, int b)
    {
        this.x = a;
        this.y = b;
    }
};
 
// Utility function to find GCD of two numbers
// GCD of a and b
static int gcd(int a, int b)
{
    if (b == 0)
    return a;
    return gcd(b, a % b);
}
 
// Finds the no. of Integral points between
// two given points.
static int getCount(Point p, Point q)
{
    // If line joining p and q is parallel to
    // x axis, then count is difference of y
    // values
    if (p.x == q.x)
        return Math.Abs(p.y - q.y) - 1;
 
    // If line joining p and q is parallel to
    // y axis, then count is difference of x
    // values
    if (p.y == q.y)
        return Math.Abs(p.x - q.x) - 1;
 
    return gcd(Math.Abs(p.x - q.x), Math.Abs(p.y - q.y)) - 1;
}
 
// Driver code
public static void Main(String[] args)
{
    Point p = new Point(1, 9);
    Point q = new Point(8, 16);
 
    Console.WriteLine("The number of integral points between "
        + "(" + p.x + ", " + p.y + ") and ("
        + q.x + ", " + q.y + ") is "
        + getCount(p, q));
}
}
 
/* This code contributed by PrinciRaj1992 */

Javascript

<script>
// javascript code to find the number of integral points
// lying on the line joining the two given points
    // Class to represent an Integral point on XY plane.
     class Point {
     
        constructor(a , b) {
            this.x = a;
            this.y = b;
        }
    }
 
    // Utility function to find GCD of two numbers
    // GCD of a and b
    function gcd(a , b) {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }
 
    // Finds the no. of Integral points between
    // two given points.
    function getCount( p,  q)
    {
     
        // If line joining p and q is parallel to
        // x axis, then count is difference of y
        // values
        if (p.x == q.x)
            return Math.abs(p.y - q.y) - 1;
 
        // If line joining p and q is parallel to
        // y axis, then count is difference of x
        // values
        if (p.y == q.y)
            return Math.abs(p.x - q.x) - 1;
 
        return gcd(Math.abs(p.x - q.x), Math.abs(p.y - q.y)) - 1;
    }
 
    // Driver program to test above   
         p = new Point(1, 9);
         q = new Point(8, 16);
 
        document.write("The number of integral points between " + "(" + p.x + ", " + p.y + ") and (" + q.x + ", "
                + q.y + ") is " + getCount(p, q));
 
// This code is contributed by gauravrajput1
</script>

Producción: 
 

The number of integral points between (1, 9) and (8, 16) is 6

Complejidad de tiempo: O(log(min(a,b))), ya que estamos usando la recursividad para encontrar el GCD.

Espacio auxiliar: O(1), ya que no estamos utilizando ningún espacio adicional.
Referencia: 
https://www.geeksforgeeks.org/count-integral-points-inside-a-triangle/
Este artículo ha sido aportado por Paridhi Johari. Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
  
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *