Determine the numer of squares that line will pass through

Given the 2 end points (x1, y1) and (x2, y2) of a line. The task is to determine the numer of squares that line will pass through.

Examples:

Input: (x1 = 1, y1 = 1), (x2 = 4, y2 = 3)
Output: 4
In the diagram above the line is passing
through 4 squares

Input: (x1 = 0, y1 = 0), (x2 = 2, y2 = 2)
Output: 2



Approach:
Let,

Dx = (x2 - x1)
Dy = (y2 - y1)

Therefore,

x = x1 + Dx * t
y = y1 + Dy * t

We have to find (x, y) for t in (0, 1].

For, x and y to be integral Dx and Dy must be divisible by t. Also, t cannot be irrational since Dx and Dy are integers.

Therefore let t = p / q.

Dx and Dy must be divisible by q. So GCD of Dx and Dy must be q.
Or, q = GCD(Dx, Dy).

There are only GCD(Dx, Dy) smallest subproblems.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

#include<bits/stdc++.h>
using namespace std;
  
// Function to return the required position
int noOfSquares(int x1, int y1, int x2, int y2)
{
    int dx = abs(x2 - x1);
    int dy = abs(y2 - y1);
  
    int ans = dx + dy - __gcd(dx, dy);
  
    cout<<ans;
}
  
// Driver Code
int main()
{
    int x1 = 1, y1 = 1, x2 = 4, y2 = 3;
  
    noOfSquares(x1, y1, x2, y2);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to determine the numer 
// of squares that line will pass through
class GFG
{
static int __gcd(int a, int b) 
    if (b == 0
        return a; 
    return __gcd(b, a % b); 
      
  
// Function to return the required position
static void noOfSquares(int x1, int y1, 
                        int x2, int y2)
{
    int dx = Math.abs(x2 - x1);
    int dy = Math.abs(y2 - y1);
  
    int ans = dx + dy - __gcd(dx, dy);
  
    System.out.println(ans);
}
  
// Driver Code
public static void main(String []args)
{
    int x1 = 1, y1 = 1, x2 = 4, y2 = 3;
  
    noOfSquares(x1, y1, x2, y2);
}
}
  
// This code contributed by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to determine the numer 
# of squares that line will pass through 
from math import gcd
  
# Function to return the required position 
def noOfSquares(x1, y1, x2, y2) : 
  
    dx = abs(x2 - x1); 
    dy = abs(y2 - y1); 
  
    ans = dx + dy - gcd(dx, dy); 
  
    print(ans); 
  
# Driver Code 
if __name__ == "__main__"
  
    x1 = 1; y1 = 1; x2 = 4; y2 = 3
  
    noOfSquares(x1, y1, x2, y2); 
  
# This code is contributed by Ryuga

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

using System;
  
class GFG
{
static int __gcd(int a, int b) 
    if (b == 0) 
        return a; 
    return __gcd(b, a % b); 
      
  
// Function to return the required position
static void noOfSquares(int x1, int y1, 
                        int x2, int y2)
{
    int dx = Math.Abs(x2 - x1);
    int dy = Math.Abs(y2 - y1);
  
    int ans = dx + dy - __gcd(dx, dy);
  
    Console.WriteLine(ans);
}
  
// Driver Code
static void Main()
{
    int x1 = 1, y1 = 1, x2 = 4, y2 = 3;
  
    noOfSquares(x1, y1, x2, y2);
}
}
  
// This code is contributed by mits

chevron_right


PHP

Output:

4

Time Complexity: O(1)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.