Given starting and ending position and a number N. Given that we are allowed to move in only four directions as shown in the image below. The directions of moves are U(), R
, D
and L
. We need to write a program to determine if starting from the given starting position we can reach the given end position in exactly N moves in moving about any direction(Clockwise or Anticlockwise).Â
Â
Examples :Â
Â
Input: start = U , end = L , N = 3 Output: Clockwise Explanation: Step 1: move clockwise to reach R Step 2: move clockwise to reach D Step 3: move clockwise to reach L So we reach from U to L in 3 steps moving in clockwise direction. Input: start = R , end = L , N = 3 Output: Not possible Explanation: It is not possible to start from R and end at L in 3 steps moving about in any direction. Input: start = D , end = R , N = 7 Output: Clockwise Explanation: Starting at D, we complete one complete clockwise round in 4 steps to reach D again, then it takes 3 step to reach R
Â
The idea to solve this problem is to observe that we can complete one round in 4 steps by traveling in any direction (clockwise or anti-clockwise), so taking n%4 steps is equivalent to taking n steps from the starting point. Therefore n is reduced to n%4. Consider the values of ‘U’ as 0, ‘R’ as 1, ‘D’ as 2 and ‘L’ as 3. If the abs(value(a)-value(b)) is 2 and n is also 2, then we can move either in clockwise or anticlockwise direction to reach the end position from the start position. If moving k steps in clockwise direction take us to the end position from start position then we can say that the condition for clockwise move will be (value(a)+k)%4==value(b). Similarly, the condition for anticlockwise move will be (value(a)+k*3)%4==value(b) since taking k step from position a in clockwise direction is equivalent to taking (a + k*3)%4 steps in anticlockwise direction.Â
Below is the implementation of the above approach:Â
Â
C++
// CPP program to determine if // starting from the starting // position we can reach the  // end position in N moves // moving about any direction #include <bits/stdc++.h> using namespace std;   // function that returns mark // up value of directions int value( char a) {     if (a == 'U' )         return 0;     if (a == 'R' )         return 1;     if (a == 'D' )         return 2;     if (a == 'L' )         return 3; }   // function to print // the possible move void printMove( char a, char b, int n) {     // mod with 4 as completing     // 4 steps means completing     // one single round     n = n % 4;       // when n is 2 and the     // difference between moves is 2     if (n == 2 and abs (value(a) -                        value(b)) == 2)         cout << "Clockwise or Anticlockwise" ;       // anticlockwise condition     else if ((value(a) + n * 3) % 4 == value(b))         cout << "Anticlockwise" ;       // clockwise condition     else if ((value(a) + n) % 4 == value(b))         cout << "Clockwise" ;     else         cout << "Not Possible" ; }   // Driver Code int main() {     char a = 'D' , b = 'R' ;     int n = 7;     printMove(a, b, n);       return 0; } |
Java
// Java program to determine if // starting from the starting // position we can reach the // end position in N moves // moving about any direction class GFG {     // function that returns mark     // up value of directions     static int value( char a)     {         if (a == 'U' )             return 0 ;         if (a == 'R' )             return 1 ;         if (a == 'D' )             return 2 ;         if (a == 'L' )             return 3 ;                           return - 1 ;     }       // function to print     // the possible move     static void printMove( char a,                           char b,                           int n)     {         // mod with 4 as completing         // 4 steps means completing         // one single round         n = n % 4 ;               // when n is 2 and         // the difference         // between moves is 2         if (n == 2 && Math.abs(value(a) -                                value(b)) == 2 )             System.out.println( "Clockwise " +                         " or Anticlockwise" );               // anticlockwise condition         else if ((value(a) + n * 3 ) %                        4 == value(b))             System.out.println( "Anticlockwise" );               // clockwise condition         else if ((value(a) + n) % 4 == value(b))             System.out.println( "Clockwise" );         else             System.out.println( "Not Possible" );     }       // Driver Code     public static void main(String args[])     {         char a = 'D' , b = 'R' ;         int n = 7 ;         printMove(a, b, n);     } }   // This code is contributed by Sam007 |
Python3
# python program to determine # if starting from the starting # position we can reach the end # position in N moves moving  # any direction   # function that returns mark # up value of directions def value(a):           if (a = = 'U' ):         return 0     if (a = = 'R' ):         return 1     if (a = = 'D' ):         return 2     if (a = = 'L' ):         return 3   # function to print # the possible move def printMove(a, b, n):           # mod with 4 as completing     # 4 steps means completing     # one single round     n = n % 4 ;       # when n is 2 and     # the difference     # between moves is 2     if (n = = 2 and         abs (value(a) - value(b)) = = 2 ):         print ( "Clockwise or Anticlockwise" )       # anticlockwise condition     elif ((value(a) + n * 3 ) % 4 = = value(b)):         print ( "Anticlockwise" )       # clockwise condition     elif ((value(a) + n) % 4 = = value(b)):         print ( "Clockwise" )     else :         print ( "Not Possible" )     # Driver Code a = 'D' b = 'R' n = 7 printMove(a, b, n)   # This code is contributed by Sam007. |
C#
// C# program to determine // if starting from the // starting position we // can reach the end position // in N moves moving about // any direction using System;   class GFG {     // function that returns mark     // up value of directions     static int value( char a)     {         if (a == 'U' )             return 0;         if (a == 'R' )             return 1;         if (a == 'D' )             return 2;         if (a == 'L' )             return 3;                       return -1;     }       // function to print     // the possible move     static void printMove( char a,                           char b,                           int n)     {         // mod with 4 as completing         // 4 steps means completing         // one single round         n = n % 4;               // when n is 2 and         // the difference         // between moves is 2         if (n == 2 && Math.Abs(value(a) -                                value(b)) == 2)             Console.Write( "Clockwise " +                     "or Anticlockwise" );               // anticlockwise condition         else if ((value(a) + n * 3) %                         4 == value(b))             Console.Write( "Anticlockwise" );               // clockwise condition         else if ((value(a) + n) %                     4 == value(b))             Console.WriteLine( "Clockwise" );         else             Console.WriteLine( "Not Possible" );     }       // Driver Code     public static void Main()     {     char a = 'D' , b = 'R' ;     int n = 7;     printMove(a, b, n);     } }   // This code is contributed by Sam007 |
PHP
<?php // PHP program to determine // if starting from the // starting position we can // reach the end position in // N moves moving about // any direction   // function that returns mark // up value of directions   function value( $a ) {     if ( $a == 'U' )         return 0;     if ( $a == 'R' )         return 1;     if ( $a == 'D' )         return 2;     if ( $a == 'L' )         return 3; }   // function to print // the possible move function printMove( $a , $b , $n ) {     // mod with 4 as completing     // 4 steps means completing     // one single round     $n = $n % 4;       // when n is 2 and the     // difference between     // moves is 2     if ( $n == 2 and abs (value( $a ) -                         value( $b )) == 2)         echo "Clockwise or Anticlockwise" ;       // anticlockwise condition     else if ((value( $a ) + $n * 3) %                     4 == value( $b ))         echo "Anticlockwise" ;       // clockwise condition     else if ((value( $a ) + $n ) %                 4 == value( $b ))         echo "Clockwise" ;     else         echo "Not Possible" ; }   // Driver Code $a = 'D' ; $b = 'R' ; $n = 7; printMove( $a , $b , $n );   // This code is contributed ajit. ?> |
Javascript
<script>   // JavaScript program to determine if // starting from the starting // position we can reach the // end position in N moves // moving about any direction       // function that returns mark     // up value of directions     function value(a)     {         if (a == 'U' )             return 0;         if (a == 'R' )             return 1;         if (a == 'D' )             return 2;         if (a == 'L' )             return 3;                             return -1;     }         // function to print     // the possible move     function printMove(a, b, n)     {         // mod with 4 as completing         // 4 steps means completing         // one single round         n = n % 4;                 // when n is 2 and         // the difference         // between moves is 2         if (n == 2 && Math.abs(value(a) -                                value(b)) == 2)             document.write( "Clockwise " +                         " or Anticlockwise" );                 // anticlockwise condition         else if ((value(a) + n * 3) %                        4 == value(b))             document.write( "Anticlockwise" );                 // clockwise condition         else if ((value(a) + n) % 4 == value(b))             document.write( "Clockwise" );         else             document.write( "Not Possible" );     }       // Driver code               let a = 'D' , b = 'R' ;         let n = 7;         printMove(a, b, n);           // This code is contributed by code_hunt. </script> |
Output :Â
Â
Clockwise
 Time Complexity: O(1), as we are not using any loop or recursion to traverse.
Auxiliary Space: O(1), as we are not using any extra space.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!