Given a screen containing alphabets from A-Z, we can go from one character to another characters using a remote. The remote contains left, right, top and bottom keys.
Find shortest possible path to type all characters of given string using the remote. Initial position is top left and all characters of input string should be printed in order.
Screen:
A B C D E
F G H I J
K L M N O
P Q R S T
U V W X Y
Z
Example:
Input: “GEEK”
Output:
Move Down
Move Right
Press OK
Move Up
Move Right
Move Right
Move Right
Press OK
Press OK
Move Left
Move Left
Move Left
Move Left
Move Down
Move Down
Press OK
The idea is to consider screen as 2D-matrix of characters. Then we consider all characters of given string one by one and print out the shortest path between current character and next character in the matrix. In order to find shortest path, we consider the coordinates of current character and next character in the matrix. Based on the difference between x and y values of current and next character’s coordinates, we move left, right, top or bottom. i.e.
If row difference is negative, we move up
If row difference is positive, we move down
If column difference is negative, we go left
If column difference is positive, we go right
Below is implementation of above idea
C++
#include <iostream>
using namespace std;
void printPath(string str)
{
int i = 0;
int curX = 0, curY = 0;
while (i < str.length())
{
int nextX = (str[i] - 'A' ) / 5;
int nextY = (str[i] - 'B' + 1) % 5;
while (curX > nextX)
{
cout << "Move Up" << endl;
curX--;
}
while (curY > nextY)
{
cout << "Move Left" << endl;
curY--;
}
while (curX < nextX)
{
cout << "Move Down" << endl;
curX++;
}
while (curY < nextY)
{
cout << "Move Right" << endl;
curY++;
}
cout << "Press OK" << endl;
i++;
}
}
int main()
{
string str = "COZY" ;
printPath(str);
return 0;
}
|
Java
class GFG
{
static void printPath(String str)
{
int i = 0 ;
int curX = 0 , curY = 0 ;
while (i < str.length())
{
int nextX = (str.charAt(i) - 'A' ) / 5 ;
int nextY = (str.charAt(i) - 'B' + 1 ) % 5 ;
while (curX > nextX)
{
System.out.println( "Move Up" );
curX--;
}
while (curY > nextY)
{
System.out.println( "Move Left" );
curY--;
}
while (curX < nextX)
{
System.out.println( "Move Down" );
curX++;
}
while (curY < nextY)
{
System.out.println( "Move Right" );
curY++;
}
System.out.println( "Press OK" );
i++;
}
}
public static void main (String[] args)
{
String str = "COZY" ;
printPath(str);
}
}
|
Python3
def printPath( str ):
i = 0
curX = 0
curY = 0
while (i < len ( str )):
nextX = int (( ord ( str [i]) - ord ( 'A' )) / 5 )
nextY = ( ord ( str [i]) - ord ( 'B' ) + 1 ) % 5
while (curX > nextX):
print ( "Move Up" )
curX - = 1
while (curY > nextY):
print ( "Move Left" )
curY - = 1
while (curX < nextX):
print ( "Move Down" )
curX + = 1
while (curY < nextY):
print ( "Move Right" )
curY + = 1
print ( "Press OK" )
i + = 1
if __name__ = = '__main__' :
str = "COZY"
printPath( str )
|
C#
using System;
class GFG {
static void printPath(String str)
{
int i = 0;
int curX = 0, curY = 0;
while (i < str.Length)
{
int nextX = (str[i] - 'A' ) / 5;
int nextY = (str[i] - 'B' + 1) % 5;
while (curX > nextX)
{
Console.WriteLine( "Move Up" );
curX--;
}
while (curY > nextY)
{
Console.WriteLine( "Move Left" );
curY--;
}
while (curX < nextX)
{
Console.WriteLine( "Move Down" );
curX++;
}
while (curY < nextY)
{
Console.WriteLine( "Move Right" );
curY++;
}
Console.WriteLine( "Press OK" );
i++;
}
}
public static void Main ()
{
String str = "COZY" ;
printPath(str);
}
}
|
PHP
<?php
function printPath( $str )
{
$i = 0;
$curX = $curY = 0;
while ( $i < strlen ( $str ))
{
$nextX = (int)((ord( $str [ $i ]) - ord( 'A' )) / 5);
$nextY = (ord( $str [ $i ]) - ord( 'B' ) + 1) % 5;
while ( $curX > $nextX )
{
echo "Move Up\n" ;
$curX --;
}
while ( $curY > $nextY )
{
echo "Move Left\n" ;
$curY --;
}
while ( $curX < $nextX )
{
echo "Move Down\n" ;
$curX ++;
}
while ( $curY < $nextY )
{
echo "Move Right\n" ;
$curY ++;
}
echo "Press OK\n" ;
$i ++;
}
}
$str = "COZY" ;
printPath( $str );
?>
|
Javascript
<script>
function printPath(str)
{
let i = 0;
let curX = 0, curY = 0;
while (i < str.length)
{
let nextX = parseInt((str[i].charCodeAt() -
'A' .charCodeAt()) / 5, 10);
let nextY = (str[i].charCodeAt() -
'B' .charCodeAt() + 1) % 5;
while (curX > nextX)
{
document.write( "Move Up" + "</br>" );
curX--;
}
while (curY > nextY)
{
document.write( "Move Left" + "</br>" );
curY--;
}
while (curX < nextX)
{
document.write( "Move Down" + "</br>" );
curX++;
}
while (curY < nextY)
{
document.write( "Move Right" + "</br>" );
curY++;
}
document.write( "Press OK" + "</br>" );
i++;
}
}
let str = "COZY" ;
printPath(str);
</script>
|
Output:
Move Right
Move Right
Press OK
Move Down
Move Down
Move Right
Move Right
Press OK
Move Left
Move Left
Move Left
Move Left
Move Down
Move Down
Move Down
Press OK
Move Up
Move Right
Move Right
Move Right
Move Right
Press OK
Time Complexity: O(n*n), where n represents the size of the given string.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
15 Jun, 2022
Like Article
Save Article