Given 2 endpoints (x1, y1) and (x2, y2) of a line, the task is to determine the number of squares of the unit area 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:
#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;
} |
// Java program to determine the number // 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 |
# Python3 program to determine the number # 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 |
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 |
<?php // PHP program to determine the number // of squares that line will pass through // Function to return the required position function noOfSquares( $x1 , $y1 , $x2 , $y2 )
{ $dx = abs ( $x2 - $x1 );
$dy = abs ( $y2 - $y1 );
$ans = $dx + $dy - gcd( $dx , $dy );
echo ( $ans );
} function gcd( $a , $b )
{ if ( $b == 0)
return $a ;
return gcd( $b , $a % $b );
} // Driver Code $x1 = 1; $y1 = 1; $x2 = 4; $y2 = 3;
noOfSquares( $x1 , $y1 , $x2 , $y2 );
// This code has been contributed // by 29AjayKumar ?> |
<script> function __gcd(a, b)
{ if (b == 0)
return a;
return __gcd(b, a % b);
} // Function to return the required position function noOfSquares(x1, y1, x2, y2)
{ var dx = Math.abs(x2 - x1);
var dy = Math.abs(y2 - y1);
var ans = dx + dy - __gcd(dx, dy);
document.write(ans);
} // Driver Code var x1 = 1, y1 = 1, x2 = 4, y2 = 3;
noOfSquares(x1, y1, x2, y2); // This code is contributed by noob2000. </script> |
4
Time Complexity: O(logn)
Auxiliary Space: O(1)