Check if a given sequence of moves for a robot is circular or not
Given a sequence of moves for a robot, check if the sequence is circular or not. A sequence of moves is circular if first and last positions of robot are same. A move can be one of the following.
G - Go one unit
L - Turn left
R - Turn right
Examples:
Input: path[] = "GLGLGLG"
Output: Given sequence of moves is circular
Input: path[] = "GLLG"
Output: Given sequence of moves is circular
The idea is to consider the starting position as (0, 0) and direction as East (We can pick any values for these). If after the given sequence of moves, we come back to (0, 0), then given sequence is circular, otherwise not.
N
|
|
W -------------- E
|
|
S
The move ‘G’ changes either x or y according to following rules.
- If current direction is North, then ‘G’ increments y and doesn’t change x.
- If current direction is East, then ‘G’ increments x and doesn’t change y.
- If current direction is South, then ‘G’ decrements y and doesn’t change x.
- If current direction is West, then ‘G’ decrements x and doesn’t change y.
The moves ‘L’ and ‘R’, do not change x and y coordinates, they only change direction according to following rule.
- If current direction is North, then ‘L’ changes direction to West and ‘R’ changes to East
- If current direction is East, then ‘L’ changes direction to North and ‘R’ changes to South
- If current direction is South, then ‘L’ changes direction to East and ‘R’ changes to West
- If current direction is West, then ‘L’ changes direction to South and ‘R’ changes to North.
Below is the implementation of above idea :
C++
#include<iostream>
using namespace std;
#define N 0
#define E 1
#define S 2
#define W 3
bool isCircular( char path[])
{
int x = 0, y = 0;
int dir = N;
for ( int i=0; path[i]; i++)
{
char move = path[i];
if (move == 'R' )
dir = (dir + 1)%4;
else if (move == 'L' )
dir = (4 + dir - 1)%4;
else
{
if (dir == N)
y++;
else if (dir == E)
x++;
else if (dir == S)
y--;
else
x--;
}
}
return (x == 0 && y == 0);
}
int main()
{
char path[] = "GLGLGLG" ;
if (isCircular(path))
cout << "Given sequence of moves is circular" ;
else
cout << "Given sequence of moves is NOT circular" ;
}
|
Java
class GFG {
static boolean isCircular( char path[])
{
int x = 0 , y = 0 ;
int dir = 0 ;
for ( int i= 0 ; i < path.length; i++)
{
char move = path[i];
if (move == 'R' )
dir = (dir + 1 )% 4 ;
else if (move == 'L' )
dir = ( 4 + dir - 1 ) % 4 ;
else
{
if (dir == 0 )
y++;
else if (dir == 1 )
x++;
else if (dir == 2 )
y--;
else
x--;
}
}
return (x == 0 && y == 0 );
}
public static void main(String[] args)
{
String path_ = "GLGLGLG" ;
char path[] = path_.toCharArray();
if (isCircular(path))
System.out.println( "Given sequence" +
" of moves is circular" );
else
System.out.println( "Given sequence" +
" of moves is NOT circular" );
}
}
|
Python
N = 0
E = 1
S = 2
W = 3
def isCircular(path):
x = 0
y = 0
dir = N
for i in xrange ( len (path)):
move = path[i]
if move = = 'R' :
dir = ( dir + 1 ) % 4
elif move = = 'L' :
dir = ( 4 + dir - 1 ) % 4
else :
if dir = = N:
y + = 1
elif dir = = E:
x + = 1
elif dir = = S:
y - = 1
else :
x - = 1
return (x = = 0 and y = = 0 )
path = "GLGLGLG"
if isCircular(path):
print "Given sequence of moves is circular"
else :
print "Given sequence of moves is NOT circular"
|
C#
using System;
class GFG {
static bool isCircular( string path)
{
int x = 0, y = 0;
int dir = 0;
for ( int i = 0; i < path.Length; i++)
{
char move = path[i];
if (move == 'R' )
dir = (dir + 1) % 4;
else if (move == 'L' )
dir = (4 + dir - 1) % 4;
else
{
if (dir == 0)
y++;
else if (dir == 1)
x++;
else if (dir == 2)
y--;
else
x--;
}
}
return (x == 0 && y == 0);
}
public static void Main(String[] args)
{
string path = "GLGLGLG" ;
if (isCircular(path))
Console.WriteLine( "Given sequence of moves is circular" );
else
Console.WriteLine( "Given sequence of moves is NOT circular" );
}
}
|
Javascript
<script>
function isCircular(path)
{
let x = 0, y = 0;
let dir = 0;
for (let i = 0; i < path.length; i++)
{
let move = path[i];
if (move == 'R' )
dir = (dir + 1) % 4;
else if (move == 'L' )
dir = (4 + dir - 1) % 4;
else
{
if (dir == 0)
y++;
else if (dir == 1)
x++;
else if (dir == 2)
y--;
else
x--;
}
}
return (x == 0 && y == 0);
}
let path = "GLGLGLG" ;
if (isCircular(path))
document.write( "Given sequence of moves is circular" );
else
document.write( "Given sequence of moves is NOT circular" );
</script>
|
Output
Given sequence of moves is circular
Time Complexity: O(n) where n is number of moves in given sequence.
Auxiliary Space: O(1)
Approach 2: Using a Hash Map
In this approach, we can maintain a hash map to store the count of the number of times the robot has visited a particular position. We can start from the initial position (0,0) and then update the position of the robot based on the moves given in the sequence. After completing the sequence, if the robot returns to the initial position and has not visited any other position more than once, then we can say that the sequence is circular.
In this approach, we maintain the current position and direction of the robot using two variables x and y and dir, respectively. We also maintain a hash map freq to store the frequency of each direction encountered in the path so far. For each character in the path, we update the position and direction of the robot and increment the frequency of the current direction in the hash map. After processing each move, we check if the robot has returned to the initial position and direction. If so, and if the frequency of each direction encountered so far is equal, then we conclude that the sequence of moves is circular. Otherwise, we continue processing the remaining moves.
C++
#include <bits/stdc++.h>
using namespace std;
bool isCircular( char * path) {
int x = 0, y = 0;
int dir = 0;
unordered_map< char , int > freq;
freq[ 'N' ] = freq[ 'E' ] = freq[ 'S' ] = freq[ 'W' ] = 0;
for ( int i = 0; path[i] != '\0' ; i++) {
if (path[i] == 'N' ) {
y++;
dir = 0;
} else if (path[i] == 'E' ) {
x++;
dir = 1;
} else if (path[i] == 'S' ) {
y--;
dir = 2;
} else if (path[i] == 'W' ) {
x--;
dir = 3;
}
freq[path[i]]++;
if (x == 0 && y == 0 && dir == 0 && freq[ 'N' ] == freq[ 'S' ] && freq[ 'E' ] == freq[ 'W' ]) {
return true ;
}
}
return false ;
}
int main() {
char path[] = "GLGLGLG" ;
if (isCircular(path)) {
cout << "The given sequence of moves is circular" ;
} else {
cout << "The given sequence of moves is not circular" ;
}
return 0;
}
|
Java
import java.util.HashMap;
public class Main {
static boolean isCircular( char [] path) {
int x = 0 , y = 0 ;
int dir = 0 ;
HashMap<Character, Integer> freq = new HashMap<>();
freq.put( 'N' , 0 );
freq.put( 'E' , 0 );
freq.put( 'S' , 0 );
freq.put( 'W' , 0 );
for ( char c : path) {
if (c == 'N' ) {
y++;
dir = 0 ;
} else if (c == 'E' ) {
x++;
dir = 1 ;
} else if (c == 'S' ) {
y--;
dir = 2 ;
} else if (c == 'W' ) {
x--;
dir = 3 ;
}
if (c == 'N' || c == 'S' || c == 'W' || c == 'E' )
freq.put(c, freq.get(c) + 1 );
if (x == 0 && y == 0 && dir == 0 &&
freq.get( 'N' ) == freq.get( 'S' ) &&
freq.get( 'E' ) == freq.get( 'W' )) {
return true ;
}
}
return false ;
}
public static void main(String[] args) {
char [] path = "GLGLGLG" .toCharArray();
if (isCircular(path)) {
System.out.println( "The given sequence of moves is circular" );
} else {
System.out.println( "The given sequence of moves is not circular" );
}
}
}
|
Python3
def isCircular(path):
x, y = 0 , 0
dir = 0
freq = {
'N' : 0 ,
'E' : 0 ,
'S' : 0 ,
'W' : 0
}
for c in path:
if c = = 'N' :
y + = 1
dir = 0
elif c = = 'E' :
x + = 1
dir = 1
elif c = = 'S' :
y - = 1
dir = 2
elif c = = 'W' :
x - = 1
dir = 3
try :
freq + = 1
except :
pass
if x = = 0 and y = = 0 and dir = = 0 and freq[ 'N' ] = = freq[ 'S' ] and freq[ 'E' ] = = freq[ 'W' ]:
return True
return False
path = "GLGLGLG"
if isCircular(path):
print ( "The given sequence of moves is circular" )
else :
print ( "The given sequence of moves is not circular" )
|
C#
using System;
using System.Collections.Generic;
class Program {
static bool IsCircular( char [] path) {
int x = 0, y = 0;
int dir = 0;
Dictionary< char , int > freq = new Dictionary< char , int > {
{ 'N' , 0 },
{ 'E' , 0 },
{ 'S' , 0 },
{ 'W' , 0 }
};
foreach ( char c in path) {
if (c == 'N' ) {
y++;
dir = 0;
} else if (c == 'E' ) {
x++;
dir = 1;
} else if (c == 'S' ) {
y--;
dir = 2;
} else if (c == 'W' ) {
x--;
dir = 3;
}
if (c == 'N' || c == 'S' || c == 'W' || c == 'E' )
freq++;
if (x == 0 && y == 0 && dir == 0 &&
freq[ 'N' ] == freq[ 'S' ] &&
freq[ 'E' ] == freq[ 'W' ]) {
return true ;
}
}
return false ;
}
static void Main( string [] args) {
char [] path = "GLGLGLG" .ToCharArray();
if (IsCircular(path)) {
Console.WriteLine( "The given sequence of moves is circular" );
} else {
Console.WriteLine( "The given sequence of moves is not circular" );
}
}
}
|
Javascript
function isCircular(path) {
let x = 0, y = 0;
let dir = 0;
const freq = { 'N' : 0, 'E' : 0, 'S' : 0, 'W' : 0 };
for (let i = 0; i < path.length; i++) {
const c = path[i];
if (c === 'N' ) {
y++;
dir = 0;
} else if (c === 'E' ) {
x++;
dir = 1;
} else if (c === 'S' ) {
y--;
dir = 2;
} else if (c === 'W' ) {
x--;
dir = 3;
}
freq++;
if (x === 0 && y === 0 && dir === 0 && freq[ 'N' ] === freq[ 'S' ] &&
freq[ 'E' ] === freq[ 'W' ]) {
return true ;
}
}
return false ;
}
const path = [ 'G' , 'L' , 'G' , 'L' , 'G' , 'L' , 'G' ];
if (isCircular(path)) {
console.log( "The given sequence of moves is circular" );
} else {
console.log( "The given sequence of moves is not circular" );
}
|
Output
The given sequence of moves is circular
Time Complexity: O(n) where n is the number of moves in the given sequence.
Auxiliary Space: O(n)
Last Updated :
19 Sep, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...