Determine the number of squares of unit area that a given line will pass through.
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:
C++
#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
// 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
# 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 |
C#
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 // 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 ?> |
Javascript
<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)
Please Login to comment...