Skip to content
Related Articles
Minimize steps defined by a string required to reach the destination from a given source
• Difficulty Level : Expert
• Last Updated : 09 Apr, 2021

Given a string str and four integers X1, Y1, X2 and Y2, where (X1, Y1) denotes the source coordinates and (X2, Y2) denotes the coordinates of the destination. Given a string str, the task is to find the minimum number of steps of the following four types required to reach destination from the source:

• If str[i] = ‘E’: Convert (X1, Y1) to (X1 + 1, Y1).
• If str[i] = ‘W’: Convert (X1, Y1) to (X1 – 1, Y1).
• If str[i] = ‘N’: Convert (X1, Y1) to (X1, Y1 + 1).
• If str[i] = ‘S’: Convert (X1, Ysub>1) to (X1, Y1 – 1).

If the destination cannot be reached, print -1
Note: It is not necessary to use str[i] always and can be skipped. But skipped characters will add to the steps used.

Examples

Input: str = “SESNW”, x1 = 0, y1 = 0, x2 = 1, y2 = 1
Output:
Explanation:
To move from (0, 0) to (1, 1), it requires one ‘E’ and one ‘N’
Therefore, the path defined by the substring “SESN” ensures that the destination is reached {(0, 0) -> skip S -> E(1, 0) -> skip S -> (1, 1)}.
Therefore, the minimum length of the string traversed is 4.

Input: str = “NNNNNNNN”, x1 = 1, y1 = 1, x2 = 1, y2 = 2
Output:
Explanation:
From current position (1, 1) it can move to co-ordinate (1, 2) using first ‘N’ direction.
Therefore, the minimum length of the string traverse is 1.

Approach: The idea is to iterate through the string and perform the moves until the destination is reached. Below are the steps:

1. Initialize four variable pos1, pos2, pos3 and pos4 to store the positions of E, W, N, S respectively.
2. Now, check if (x1, y1) is equal to (x2, y2) then the current position is already the destination so print 0.
3. Otherwise, iterate over the string and check the following four conditions:
• If x2 > x1 then iterate until a ‘E’ comes and update that index in pos1.
• If x2 < x1 then iterate until a ‘W’ comes and update that index in pos2.
• If y2 > y1 then iterate until a ‘N’ comes and update that index in pos3.
• If y2 < y1 then iterate until a ‘S’ comes and update that index in pos4.
4. After performing above operations check if x1 != x2 and y1 != y2 then print “-1” that means it is impossible to reach the destination.
5. Otherwise, find the max of pos1, pos2, pos3 and pos4 and print it.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach` `#include ``using` `namespace` `std;` `// Function to find the minimum length``// of string required to reach from``// source to destination``void` `minimum_length(``int` `x1, ``int` `y1,``                    ``int` `x2, ``int` `y2,``                    ``string str)``{``    ``// Size of the string``    ``int` `n = str.size();` `    ``// Stores the index of the four``    ``// directions E, W, N, S``    ``int` `pos1, pos2, pos3, pos4;``    ``pos1 = -1;``    ``pos2 = -1;``    ``pos3 = -1;``    ``pos4 = -1;` `    ``// If destination reached``    ``if` `(x1 == x2 && y1 == y2) {``        ``cout << 0 << endl;``    ``}` `    ``// Iterate over the string``    ``else` `{``        ``for` `(``int` `i = 0; i < n; i++) {` `            ``// Move east``            ``if` `(x2 > x1) {` `                ``// Change x1 according``                ``// to direction E``                ``if` `(str[i] == ``'E'``) {``                    ``x1 = x1 + 1;``                    ``if` `(x1 == x2) {``                        ``pos1 = i;``                    ``}``                ``}``            ``}` `            ``// Move west``            ``if` `(x2 < x1) {` `                ``// Change x1 according``                ``// to direction W``                ``if` `(str[i] == ``'W'``) {``                    ``x1 = x1 - 1;``                    ``if` `(x1 == x2) {``                        ``pos2 = i;``                    ``}``                ``}``            ``}` `            ``// Move north``            ``if` `(y2 > y1) {` `                ``// Change y1 according``                ``// to direction N``                ``if` `(str[i] == ``'N'``) {``                    ``y1 = y1 + 1;``                    ``if` `(y1 == y2) {``                        ``pos3 = i;``                    ``}``                ``}``            ``}` `            ``// Move south``            ``if` `(y2 < y1) {` `                ``// Change y1 according``                ``// to direction S``                ``if` `(str[i] == ``'S'``) {``                    ``y1 = y1 - 1;``                    ``if` `(y1 == y2) {``                        ``pos4 = i;``                    ``}``                ``}``            ``}``        ``}` `        ``int` `z;``        ``// Store the max of all positions``        ``z = max(max(max(pos1, pos2),``                    ``pos3),``                ``pos4);` `        ``// Print the minimum length of``        ``// string required``        ``if` `(x1 == x2 && y1 == y2) {``            ``cout << z + 1 << endl;``        ``}` `        ``// Otherwise, it is impossible``        ``else` `{``            ``cout << ``"-1"` `<< endl;``        ``}``    ``}``}` `// Driver Code``int` `main()``{``    ``// Given string``    ``string str = ``"SESNW"``;` `    ``// Given source and destination``    ``int` `x1 = 0, x2 = 1, y1 = 0, y2 = 1;` `    ``// Function Call``    ``minimum_length(x1, y1, x2, y2, str);``    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.util.*;``import` `java.lang.*;``import` `java.io.*;` `class` `GFG{` `// Function to find the minimum length``// of string required to reach from``// source to destination``static` `void` `minimum_length(``int` `x1, ``int` `y1,``                           ``int` `x2, ``int` `y2,``                           ``String str)``{``    ` `    ``// Size of the string``    ``int` `n = str.length();``  ` `    ``// Stores the index of the four``    ``// directions E, W, N, S``    ``int` `pos1, pos2, pos3, pos4;``    ``pos1 = -``1``;``    ``pos2 = -``1``;``    ``pos3 = -``1``;``    ``pos4 = -``1``;``  ` `    ``// If destination reached``    ``if` `(x1 == x2 && y1 == y2)``    ``{``        ``System.out.println(``"0"``);``    ``}``  ` `    ``// Iterate over the string``    ``else``    ``{``        ``for``(``int` `i = ``0``; i < n; i++)``        ``{``            ` `            ``// Move east``            ``if` `(x2 > x1)``            ``{``                ` `                ``// Change x1 according``                ``// to direction E``                ``if` `(str.charAt(i) == ``'E'``)``                ``{``                    ``x1 = x1 + ``1``;``                    ` `                    ``if` `(x1 == x2)``                    ``{``                        ``pos1 = i;``                    ``}``                ``}``            ``}``  ` `            ``// Move west``            ``if` `(x2 < x1)``            ``{``                ` `                ``// Change x1 according``                ``// to direction W``                ``if` `(str.charAt(i) == ``'W'``)``                ``{``                    ``x1 = x1 - ``1``;``                    ` `                    ``if` `(x1 == x2)``                    ``{``                        ``pos2 = i;``                    ``}``                ``}``            ``}``  ` `            ``// Move north``            ``if` `(y2 > y1)``            ``{``                ` `                ``// Change y1 according``                ``// to direction N``                ``if` `(str.charAt(i) == ``'N'``)``                ``{``                    ``y1 = y1 + ``1``;``                    ` `                    ``if` `(y1 == y2)``                    ``{``                        ``pos3 = i;``                    ``}``                ``}``            ``}``  ` `            ``// Move south``            ``if` `(y2 < y1)``            ``{``                ` `                ``// Change y1 according``                ``// to direction S``                ``if` `(str.charAt(i) == ``'S'``)``                ``{``                    ``y1 = y1 - ``1``;``                    ` `                    ``if` `(y1 == y2)``                    ``{``                        ``pos4 = i;``                    ``}``                ``}``            ``}``        ``}``        ``int` `z;``        ` `        ``// Store the max of all positions``        ``z = Math.max(pos1,``            ``Math.max(Math.max(pos2, pos3),``                              ``pos4));``                  ` `        ``// Print the minimum length of``        ``// string required``        ``if` `(x1 == x2 && y1 == y2)``        ``{``             ``System.out.println(z + ``1``); ``        ``}``  ` `        ``// Otherwise, it is impossible``        ``else``        ``{``             ``System.out.println(``"-1"``);``        ``}``    ``}``}` `// Driver Code``public` `static` `void` `main (String[] args)``throws` `java.lang.Exception``{``    ` `    ``// Given string``    ``String str = ``"SESNW"``;` `    ``// Given source and destination``    ``int` `x1 = ``0``, x2 = ``1``, y1 = ``0``, y2 = ``1``;` `    ``// Function call``    ``minimum_length(x1, y1, x2, y2, str);``}``}` `// This code is contributed by bikram2001jha`

## Python3

 `# Python3 program for the above approach` `# Function to find the minimum length``# of string required to reach from``# source to destination``def` `minimum_length(x1, y1, x2, y2, ``str``):``    ` `    ``# Size of the string``    ``n ``=` `len``(``str``)` `    ``# Stores the index of the four``    ``# directions E, W, N, S``    ``pos1 ``=` `-``1``    ``pos2 ``=` `-``1``    ``pos3 ``=` `-``1``    ``pos4 ``=` `-``1` `    ``# If destination reached``    ``if` `(x1 ``=``=` `x2 ``and` `y1 ``=``=` `y2):``        ``print``(``"0"``)` `    ``# Iterate over the string``    ``else``:``        ``for` `i ``in` `range``(n):` `            ``# Move east``            ``if` `(x2 > x1):` `                ``# Change x1 according``                ``# to direction E``                ``if` `(``str``[i] ``=``=` `'E'``):``                    ``x1 ``=` `x1 ``+` `1` `                    ``if` `(x1 ``=``=` `x2):``                        ``pos1 ``=` `i` `            ``# Move west``            ``if` `(x2 < x1):` `                ``# Change x1 according``                ``# to direction W``                ``if` `(``str``[i] ``=``=` `'W'``):``                    ``x1 ``=` `x1 ``-` `1` `                    ``if` `(x1 ``=``=` `x2):``                        ``pos2 ``=` `i` `            ``# Move north``            ``if` `(y2 > y1):` `                ``# Change y1 according``                ``# to direction N``                ``if` `(``str``[i] ``=``=` `'N'``):``                    ``y1 ``=` `y1 ``+` `1` `                    ``if` `(y1 ``=``=` `y2):``                        ``pos3 ``=` `i` `            ``# Move south``            ``if` `(y2 < y1):` `                ``# Change y1 according``                ``# to direction S``                ``if` `(``str``[i] ``=``=` `'S'``):``                    ``y1 ``=` `y1 ``-` `1` `                    ``if` `(y1 ``=``=` `y2):``                        ``pos4 ``=` `i` `        ``z ``=` `0` `        ``# Store the max of all positions``        ``z ``=` `max``(pos1, ``max``(``max``(pos2, pos3), pos4))` `        ``# Print the minimum length of``        ``# string required``        ``if` `(x1 ``=``=` `x2 ``and` `y1 ``=``=` `y2):``            ``print``(z ``+` `1``)` `        ``# Otherwise, it is impossible``        ``else``:``            ``print``(``"-1"``)` `# Driver Code` `# Given string``str` `=` `"SESNW"` `# Given source and destination``x1 ``=` `0``x2 ``=` `1``y1 ``=` `0``y2 ``=` `1` `# Function call``minimum_length(x1, y1, x2, y2, ``str``)` `# This code is contributed by Amit Katiyar`

## C#

 `// C# program for the above approach``using` `System;`` ` `class` `GFG{`` ` `// Function to find the minimum length``// of string required to reach from``// source to destination``static` `void` `minimum_length(``int` `x1, ``int` `y1,``                           ``int` `x2, ``int` `y2,``                           ``string` `str)``{``    ` `    ``// Size of the string``    ``int` `n = str.Length;``   ` `    ``// Stores the index of the four``    ``// directions E, W, N, S``    ``int` `pos1, pos2, pos3, pos4;``    ``pos1 = -1;``    ``pos2 = -1;``    ``pos3 = -1;``    ``pos4 = -1;``   ` `    ``// If destination reached``    ``if` `(x1 == x2 && y1 == y2)``    ``{``        ``Console.WriteLine(``"0"``);``    ``}``   ` `    ``// Iterate over the string``    ``else``    ``{``        ``for``(``int` `i = 0; i < n; i++)``        ``{``             ` `            ``// Move east``            ``if` `(x2 > x1)``            ``{``                 ` `                ``// Change x1 according``                ``// to direction E``                ``if` `(str[i] == ``'E'``)``                ``{``                    ``x1 = x1 + 1;``                     ` `                    ``if` `(x1 == x2)``                    ``{``                        ``pos1 = i;``                    ``}``                ``}``            ``}``   ` `            ``// Move west``            ``if` `(x2 < x1)``            ``{``                 ` `                ``// Change x1 according``                ``// to direction W``                ``if` `(str[i] == ``'W'``)``                ``{``                    ``x1 = x1 - 1;``                     ` `                    ``if` `(x1 == x2)``                    ``{``                        ``pos2 = i;``                    ``}``                ``}``            ``}``   ` `            ``// Move north``            ``if` `(y2 > y1)``            ``{``                 ` `                ``// Change y1 according``                ``// to direction N``                ``if` `(str[i] == ``'N'``)``                ``{``                    ``y1 = y1 + 1;``                     ` `                    ``if` `(y1 == y2)``                    ``{``                        ``pos3 = i;``                    ``}``                ``}``            ``}``   ` `            ``// Move south``            ``if` `(y2 < y1)``            ``{``                 ` `                ``// Change y1 according``                ``// to direction S``                ``if` `(str[i] == ``'S'``)``                ``{``                    ``y1 = y1 - 1;``                     ` `                    ``if` `(y1 == y2)``                    ``{``                        ``pos4 = i;``                    ``}``                ``}``            ``}``        ``}``        ``int` `z;``         ` `        ``// Store the max of all positions``        ``z = Math.Max(pos1,``            ``Math.Max(Math.Max(pos2, pos3),``                              ``pos4));``                   ` `        ``// Print the minimum length of``        ``// string required``        ``if` `(x1 == x2 && y1 == y2)``        ``{``             ``Console.WriteLine(z + 1); ``        ``}``   ` `        ``// Otherwise, it is impossible``        ``else``        ``{``             ``Console.WriteLine(``"-1"``);``        ``}``    ``}``}`` ` `// Driver Code``public` `static` `void` `Main ()``{``     ` `    ``// Given string``    ``string` `str = ``"SESNW"``;`` ` `    ``// Given source and destination``    ``int` `x1 = 0, x2 = 1, y1 = 0, y2 = 1;`` ` `    ``// Function call``    ``minimum_length(x1, y1, x2, y2, str);``}``}` `// This code is contributed by sanjoy_62`

## Javascript

 ``
Output:
`4`

Time Complexity: O(N)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live

My Personal Notes arrow_drop_up