Given side of a square n and two points (x1, y1) and (x2, y2) on the boundaries of the given square. The task is to find the shortest path through the square sides between these two points where the corner coordinates of the square are (0, 0), (n, 0), (0, n), and (n, n).
Examples:
Input: n = 2, x1 = 0, y1 = 0, x2 = 1, y2 = 0
Output: 1Input: n = 26, x1 = 21, y1 = 0, x2 = 26, y2 = 14
Output: 19
Approach:
- If both the x and y coordinates of a point is greater than the other and the points are not on opposite sides of square then the shortest distance will be abs(x2 – x1) + abs(y2 – y1).
- Else, the shortest distance will be equal to min((x1 + y1 + x2 + y2), (4 * n) – (x1 + y1 + x2 + y2))
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to return the length // of the minimum path between // two points on a square of given side int minPath( int n, int x1, int y1, int x2, int y2) { // If both of the x and y coordinates // of one point is greater than the other if ((x1 <= x2 && y1 <= y2) || (x1 >= x2 && y1 >= y2)) { // If the points are not on opposite sides if (!( abs (y2 - y1) == n || abs (x2 - x1) == n)) return ( abs (x1 - x2) + abs (y1 - y2)); } return min(x1 + x2 + y1 + y2, (4 * n) - (x1 + x2 + y1 + y2)); } // Driver code int main() { // Side of the square int n = 4; int x1 = 2, y1 = 0, x2 = 3, y2 = 4; cout << minPath(n, x1, y1, x2, y2); return 0; } // improved by Sonal Agrawal |
Java
// Java implementation of the approach class GFG{ // Function to return the length // of the minimum path between // two points on a square of given side static int minPath( int n, int x1, int y1, int x2, int y2) { // If both of the x and y coordinates // of one point is greater than the other if ((x1 <= x2 && y1 <= y2) || (x1 >= x2 && y1 >= y2)) { // If the points are not on opposite sides if (!(Math.abs(y2 - y1) == n || Math.abs(x2 - x1) == n)) return (Math.abs(x1 - x2) + Math.abs(y1 - y2)); } return Math.min(x1 + x2 + y1 + y2, ( 4 * n) - (x1 + x2 + y1 + y2)); } // Driver code public static void main(String[] args) { // Side of the square int n = 4 ; int x1 = 2 , y1 = 0 , x2 = 3 , y2 = 4 ; System.out.println(minPath(n, x1, y1, x2, y2)); } } // This code is contributed by sanjeev2552 |
Python3
# Python3 implementation of above approach # Function to return the length of the # minimum path between two points # on a square of given side def minPath(n, x1, y1, x2, y2): # If both of the x and y coordinates # of one point is greater than the other if (((x1 < = x2 and y1 < = y2) or (x1 > = x2 and y1 > = y2)) and not ( abs (y2 - y1) = = n or abs (x2 - x1) = = n)): return ( abs (x1 - x2) + abs (y1 - y2)); return min (x1 + x2 + y1 + y2, ( 4 * n) - (x1 + x2 + y1 + y2)); # Driver code # side of the square n = 4 ; x1 = 2 ; y1 = 0 x2 = 3 ; y2 = 4 print (minPath(n, x1, y1, x2, y2)) # This code is contributed # by Shashank_Sharma |
C#
// C# implementation of the approach using System; class GFG { // Function to return the length // of the minimum path between // two points on a square of given side static int minPath( int n, int x1, int y1, int x2, int y2) { // If both of the x and y coordinates // of one point is greater than the other if ((x1 <= x2 && y1 <= y2) || (x1 >= x2 && y1 >= y2)) { // If the points are not on opposite sides if (!(Math.Abs(y2 - y1) == n || Math.Abs(x2 - x1) == n)) return (Math.Abs(x1 - x2) + Math.Abs(y1 - y2)); } return Math.Min(x1 + x2 + y1 + y2, (4 * n) - (x1 + x2 + y1 + y2)); } // Driver code public static void Main() { // Side of the square int n = 4; int x1 = 2, y1 = 0, x2 = 3, y2 = 4; Console.Write(minPath(n, x1, y1, x2, y2)); } } // This code is contributed // by Akanksha Rai |
PHP
<?php // Php implementation of the approach // Function to return the length // of the minimum path between // two points on a square of given side function minPath( $n , $x1 , $y1 , $x2 , $y2 ) { // If both of the x and y coordinates // of one point is greater than the other if (( $x1 <= $x2 && $y1 <= $y2 ) || ( $x1 >= $x2 && $y1 >= $y2 )) { // If the points are not on opposite sides if (!( abs ( $y2 - $y1 ) == $n || abs ( $x2 - $x1 ) == $n )) return ( abs ( $x1 - $x2 ) + abs ( $y1 - $y2 )); } return min( $x1 + $x2 + $y1 + $y2 , (4 * $n ) - ( $x1 + $x2 + $y1 + $y2 )); } // Driver code // Side of the square $n = 4; $x1 = 2 ; $y1 = 0 ; $x2 = 3 ; $y2 = 4 ; echo minPath( $n , $x1 , $y1 , $x2 , $y2 ); // This code is contributed by Ryuga ?> |
Javascript
<script> // Javascript implementation of the approach // Function to return the length // of the minimum path between // two points on a square of given side function minPath(n, x1, y1, x2, y2) { // If both of the x and y coordinates // of one point is greater than the other if ((x1 <= x2 && y1 <= y2) || (x1 >= x2 && y1 >= y2)) { // If the points are not on opposite sides if (!(Math.abs(y2 - y1) == n || Math.abs(x2 - x1) == n)) return (Math.abs(x1 - x2) + Math.abs(y1 - y2)); } return Math.min(x1 + x2 + y1 + y2, (4 * n) - (x1 + x2 + y1 + y2)); } // Side of the square let n = 4; let x1 = 2, y1 = 0, x2 = 3, y2 = 4; document.write(minPath(n, x1, y1, x2, y2)); // This code is contributed by decode2207. </script> |
7
Time Complexity: O(1)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!