Print shortest path to print a string on screen
Last Updated :
15 Jun, 2022
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.
Share your thoughts in the comments
Please Login to comment...