Check if possible to move from given coordinate to desired coordinate
Last Updated :
06 Jul, 2022
Given two coordinates (x, y) and (a, b). Find if it is possible to reach (x, y) from (a, b).
Only possible moves from any coordinate (i, j) are
- (i-j, j)
- (i, i-j)
- (i+j, j)
- (i, i+j)
Given x, y, a, b can be negative.
Examples:
Input : (x, y) = (1, 1) and (a, b) = (2, 3).
Output : Yes.
(1, 1) -> (2, 1) -> (2, 3).
Input : (x, y) = (2, 1) and (a, b) = (2, 3).
Output : Yes.
Input : (x, y) = (35, 15) and (a, b) = (20, 25).
Output : Yes.
(35, 15) -> (20, 15) -> (5, 15) -> (5, 10) -> (5, 5) ->
(10, 5) -> (15, 5) -> (20, 5) -> (20, 25)
If we take a closer look at the problem, we can notice that the moves are similar steps of Euclidean algorithm for finding GCD. So, it is only possible to reach coordinate (a, b) from (x, y) if GCD of x, y is equal to GCD of a, b. Otherwise, it is not possible.
Let GCD of (x, y) be gcd. From (x, y), we can reach (gcd, gcd) and from this point, we can reach to (a, b) if and only if GCD of ‘a’ and ‘b’ is also gcd.
Below is the implementation of this approach:
C++
#include <bits/stdc++.h>
using namespace std;
int gcd( int i, int j)
{
if (i == j)
return i;
if (i > j)
return gcd(i - j, j);
return gcd(i, j - i);
}
bool ispossible( int x, int y, int a, int b)
{
x = abs (x), y = abs (y), a = abs (a), b = abs (b);
return (gcd(x, y) == gcd(a, b));
}
int main()
{
int x = 35, y = 15;
int a = 20, b = 25;
(ispossible(x, y, a, b)) ? (cout << "Yes" ) : (cout << "No" );
return 0;
}
|
Java
class GFG {
static int gcd( int i, int j)
{
if (i == j)
return i;
if (i > j)
return gcd(i - j, j);
return gcd(i, j - i);
}
static boolean ispossible( int x, int y, int a, int b)
{
x = Math.abs(x);
y = Math.abs(y);
a = Math.abs(a);
b = Math.abs(b);
return (gcd(x, y) == gcd(a, b));
}
public static void main(String[] args)
{
int x = 35 , y = 15 ;
int a = 20 , b = 25 ;
if (ispossible(x, y, a, b))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
def gcd(i, j):
if (i = = j):
return i
if (i > j):
return gcd(i - j, j)
return gcd(i, j - i)
def ispossible(x, y, a, b):
x, y, a, b = abs (x), abs (y), abs (a), abs (b)
return (gcd(x, y) = = gcd(a, b))
x, y = 35 , 15
a, b = 20 , 25
if (ispossible(x, y, a, b)):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG {
static int gcd( int i, int j)
{
if (i == j)
return i;
if (i > j)
return gcd(i - j, j);
return gcd(i, j - i);
}
static bool ispossible( int x, int y,
int a, int b)
{
x = Math.Abs(x);
y = Math.Abs(y);
a = Math.Abs(a);
b = Math.Abs(b);
return (gcd(x, y) == gcd(a, b));
}
public static void Main()
{
int x = 35, y = 15;
int a = 20, b = 25;
if (ispossible(x, y, a, b))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
PHP
<?php
function gcd( $i , $j )
{
if ( $i == $j )
return $i ;
if ( $i > $j )
return gcd( $i - $j , $j );
return gcd( $i , $j - $i );
}
function ispossible( $x , $y , $a , $b )
{
$x = abs ( $x );
$y = abs ( $y );
$a = abs ( $a );
$b = abs ( $b );
return (gcd( $x , $y ) == gcd( $a , $b ));
}
{
$x = 35; $y = 15;
$a = 20; $b = 25;
if (ispossible( $x , $y , $a , $b ))
echo ( "Yes" );
else
echo ( "No" );
return 0;
}
?>
|
Javascript
<script>
function gcd(i , j) {
if (i == j)
return i;
if (i > j)
return gcd(i - j, j);
return gcd(i, j - i);
}
function ispossible(x , y , a , b)
{
x = Math.abs(x);
y = Math.abs(y);
a = Math.abs(a);
b = Math.abs(b);
return (gcd(x, y) == gcd(a, b));
}
var x = 35, y = 15;
var a = 20, b = 25;
if (ispossible(x, y, a, b))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(min(x, y) + min(a, b)), where x, y, a and b are the given integers.
Auxiliary Space: O(min(x, y) + min(a, b)), space required due to the recursion stack.
Share your thoughts in the comments
Please Login to comment...