Check if it is possible to reach vector B by rotating vector A and adding vector C to it

Given three 2-Dimentional 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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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
?>

chevron_right


Output:

Yes


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.