Given three 2-Dimensional vector co-ordinates A, B and C. The task is to perform below operations any number of times on vector A to get vector B :
- Rotate the vector 90 degrees clockwise.
- Add vector C to it.
Print “YES” B is obtained using the above operations, else Print “NO”.
Examples:
Input: Vector A: 2 3, Vector B: 2 3, Vector C: 0 0 Output: YES The given vector A has coordinate (2, 3) and we need to convert this vector A to vector B which is also (2, 3). By rotating vector A 4 times by 90 degrees and adding it to vector C(0, 0) will give us vector B(2, 3). Input: Vector A: 0 0, Vector B: 1 1, Vector C: 2 2 Output: NO
Below is the step by step algorithm to solve this problem:
- Initialize three vectors of 2-D coordinates as A ( a, b ), B ( x, y ) and C ( p, q ).
- Coordinates of vector A can be of any quadrant. So, initialize a check function for all the quadrant and check if any of it is true.
- Find a-x and b-y, which will tell us how much we need to make it to vector B.
- Initialize d = p*p + q*q. If d = 0 then you need not to add anything in vector A.
- If D > 0, then check if a*p + b*q and b*p – a*q is in the multiple of ‘d’ so that it is possible to get the vector B.
Below is the implementation of above algorithm:
C++
// C++ program to Check if it is // possible to reach vector B by // Rotating vector A and adding // vector C to it any number of times #include <bits/stdc++.h> using namespace std; #define ll long long // function to check if vector B is // possible from vector A ll check(ll a, ll b, ll p, ll q) { ll d = p * p + q * q; // if d = 0, then you need to add nothing to vector A if (d == 0) return a == 0 && b == 0; else return (a * p + b * q) % d == 0 && (b * p - a * q) % d == 0; } bool check( int a, int b, int x, int y, int p, int q) { // for all four quadrants if (check(a - x, b - y, p, q) || check(a + x, b + y, p, q) || check(a - y, b + x, p, q) || check(a + y, b - x, p, q)) return true ; else return false ; } // Driver code int main() { // initialize all three // vector coordinates int a = -4, b = -2; int x = 0, y = 0; int p = -2, q = -1; if (check(a, b, x, y, p, q)) cout << "Yes" ; else cout << "No" ; return 0; } |
Java
// Java program to Check if it is // possible to reach vector B by // Rotating vector A and adding // vector C to it any number of times. public class GFG { // function to check if vector B is // possible from vector A static boolean check( long a, long b, long p, long q) { long d = p * p + q * q; // if d = 0, then you need to add nothing to vector A if (d == 0 ) return a == 0 && b == 0 ; else return (a * p + b * q) % d == 0 && (b * p - a * q) % d == 0 ; } static boolean check( int a, int b, int x, int y, int p, int q) { // for all four quadrants if (check(a - x, b - y, p, q) || check(a + x, b + y, p, q) || check(a - y, b + x, p, q) || check(a + y, b - x, p, q)) return true ; else return false ; } // Driver code public static void main(String args[]) { // initialize all three // vector coordinates int a = - 4 , b = - 2 ; int x = 0 , y = 0 ; int p = - 2 , q = - 1 ; if (check(a, b, x, y, p, q)) System.out.println( "Yes" ); else System.out.println( "No" ); } // This Code is contributed by ANKITRAI1 } |
Python3
# Python3 program to Check if it # is possible to reach vector B # by Rotating vector A and adding # vector C to it any number of times # function to check if vector B # is possible from vector A def check(a, b, p, q): d = p * p + q * q; # if d = 0, then you need to # add nothing to vector A if (d = = 0 ): return a = = 0 and b = = 0 ; else : return ((a * p + b * q) % d = = 0 and (b * p - a * q) % d = = 0 ); def checks(a, b, x, y, p, q): # for all four quadrants if (check(a - x, b - y, p, q) or check(a + x, b + y, p, q) or check(a - y, b + x, p, q) or check(a + y, b - x, p, q)): return True ; else : return False ; # Driver code # initialize all three # vector coordinates a = - 4 ; b = - 2 ; x = 0 ; y = 0 ; p = - 2 ; q = - 1 ; if (checks(a, b, x, y, p, q)): print ( "Yes" ); else : print ( "No" ); # This code is contributed # by Shivi_Aggarwal |
C#
// C# program to Check if it is // possible to reach vector B by // Rotating vector A and adding // vector C to it any number of times. using System; class GFG { // function to check if vector B is // possible from vector A static bool check( long a, long b, long p, long q) { long d = p * p + q * q; // if d = 0, then you need to // add nothing to vector A if (d == 0) return a == 0 && b == 0; else return (a * p + b * q) % d == 0 && (b * p - a * q) % d == 0; } static bool check( int a, int b, int x, int y, int p, int q) { // for all four quadrants if (check(a - x, b - y, p, q) || check(a + x, b + y, p, q) || check(a - y, b + x, p, q) || check(a + y, b - x, p, q)) return true ; else return false ; } // Driver code public static void Main() { // initialize all three // vector coordinates int a = -4, b = -2; int x = 0, y = 0; int p = -2, q = -1; if (check(a, b, x, y, p, q)) Console.Write( "Yes" ); else Console.Write( "No" ); } } // This code is contributed // by ChitraNayal |
PHP
<?php // PHP program to Check if it is // possible to reach vector B by // Rotating vector A and adding // vector C to it any number of times // function to check if vector B is // possible from vector A function check( $a , $b , $p , $q ) { $d = $p * $p + $q * $q ; // if d = 0, then you need to add nothing to vector A if ( $d == 0) return ( $a == 0 && $b == 0); else return (( $a * $p + $b * $q ) % $d == 0 && ( $b * $p - $a * $q ) % $d == 0); } function check1( $a , $b , $x , $y , $p , $q ) { // for all four quadrants if (check( $a - $x , $b - $y , $p , $q ) || check( $a + $x , $b + $y , $p , $q ) || check( $a - $y , $b + $x , $p , $q ) || check( $a + $y , $b - $x , $p , $q )) return true; else return false; } // Driver code // initialize all three // vector coordinates $a = -4; $b = -2; $x = 0; $y = 0; $p = -2; $q = -1; if (check1( $a , $b , $x , $y , $p , $q )) echo "Yes" ; else echo "No" ; // This Code is contributed by mits ?> |
Javascript
<script> // Javascript program to Check if it is // possible to reach vector B by // Rotating vector A and adding // vector C to it any number of times. // Function to check if vector B is // possible from vector A function _check(a, b, p, q) { var d = p * p + q * q; // If d = 0, then you need // to add nothing to vector A if (d == 0) return a == 0 && b == 0; else return (a * p + b * q) % d == 0 && (b * p - a * q) % d == 0; } function check(a, b, x, y, p, q) { // for all four qua // for all four quadrants if (_check(a - x, b - y, p, q) || _check(a + x, b + y, p, q) || _check(a - y, b + x, p, q) || _check(a + y, b - x, p, q)) return true ; else return false ; } // Driver code // Initialize all three // vector coordinates var a = -4, b = -2; var x = 0, y = 0; var p = -2, q = -1; if (check(a, b, x, y, p, q)) document.write( "Yes" ); else document.write( "No" ); // This code is contributed by Kirti </script> |
Yes
Time Complexity: O(1)
Auxiliary space: O(1)