Minimum steps required to visit all corners of an N * M grid
Last Updated :
14 Sep, 2021
Given two integers N and M representing the dimensions of a 2D grid, and two integers R and C, representing the position of a block in that grid, the task is to find the minimum number of steps required to visit all the corners of the grid, starting from (R, C). In each step, it is allowed to move the side-adjacent block in the grid.
Examples:
Input: N = 2, M = 2, R = 1, C = 2
Output: 3
Explanation:
(1, 2) -> (1, 1) -> (2, 1) -> (2, 2)
Therefore, the required output is 3.
Input: N = 2, M = 3, R = 2, C = 2
Output: 5
Explanation:
(2, 2) -> (2, 3) -> (1, 3) -> (1, 2) -> (1, 1) -> (2, 1)
Therefore, the required output is 5.
Approach: The problem can be solved based on the following observations.
Minimum count of steps required to visit the block (i2, j2) starting from (i1, j1) is equal to abs(i2 – i1) + abs(j2 – j1)
Follow the steps given below to solve the problem:
- First visit the corner which takes minimum count of steps using the above observations.
- Visit the other corners of the grid by traversing the boundary of the grid either in clockwise or anticlockwise, depending on which will take the minimum count of steps to visit the corners.
- Finally, print the minimum count of steps obtained.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int min_steps_required( int n, int m, int r, int c)
{
int i, j;
int corner_steps_req = INT_MAX;
i = 1;
j = 1;
corner_steps_req = min(corner_steps_req,
abs (r - i) + abs (j - c));
i = n;
j = 1;
corner_steps_req = min(corner_steps_req,
abs (r - i) + abs (j - c));
i = 1;
j = m;
corner_steps_req = min(corner_steps_req,
abs (r - i) + abs (j - c));
i = n;
j = m;
corner_steps_req = min(corner_steps_req,
abs (r - i) + abs (j - c));
int minimum_steps = min(2 * (n - 1) + m - 1,
2 * (m - 1) + n - 1);
return minimum_steps + corner_steps_req;
}
int main()
{
int n = 3;
int m = 2;
int r = 1;
int c = 1;
cout << min_steps_required(n, m, r, c);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int min_steps_required( int n, int m, int r, int c)
{
int i, j;
int corner_steps_req = Integer.MAX_VALUE;
i = 1 ;
j = 1 ;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) + Math.abs(j - c));
i = n;
j = 1 ;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) + Math.abs(j - c));
i = 1 ;
j = m;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) + Math.abs(j - c));
i = n;
j = m;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) + Math.abs(j - c));
int minimum_steps = Math.min( 2 * (n - 1 ) + m - 1 ,
2 * (m - 1 ) + n - 1 );
return minimum_steps + corner_steps_req;
}
public static void main(String[] args)
{
int n = 3 ;
int m = 2 ;
int r = 1 ;
int c = 1 ;
System.out.print(min_steps_required(n, m, r, c));
}
}
|
Python3
import sys
INT_MAX = sys.maxsize;
def min_steps_required(n, m, r, c) :
i = 0 ; j = 0 ;
corner_steps_req = INT_MAX;
i = 1 ;
j = 1 ;
corner_steps_req = min (corner_steps_req,
abs (r - i) + abs (j - c));
i = n;
j = 1 ;
corner_steps_req = min (corner_steps_req,
abs (r - i) + abs (j - c));
i = 1 ;
j = m;
corner_steps_req = min (corner_steps_req,
abs (r - i) + abs (j - c));
i = n;
j = m;
corner_steps_req = min (corner_steps_req,
abs (r - i) + abs (j - c));
minimum_steps = min ( 2 * (n - 1 ) + m - 1 ,
2 * (m - 1 ) + n - 1 );
return minimum_steps + corner_steps_req;
if __name__ = = "__main__" :
n = 3 ;
m = 2 ;
r = 1 ;
c = 1 ;
print (min_steps_required(n, m, r, c));
|
C#
using System;
class GFG{
static int min_steps_required( int n, int m,
int r, int c)
{
int i, j;
int corner_steps_req = int .MaxValue;
i = 1;
j = 1;
corner_steps_req = Math.Min(corner_steps_req,
Math.Abs(r - i) +
Math.Abs(j - c));
i = n;
j = 1;
corner_steps_req = Math.Min(corner_steps_req,
Math.Abs(r - i) +
Math.Abs(j - c));
i = 1;
j = m;
corner_steps_req = Math.Min(corner_steps_req,
Math.Abs(r - i) +
Math.Abs(j - c));
i = n;
j = m;
corner_steps_req = Math.Min(corner_steps_req,
Math.Abs(r - i) +
Math.Abs(j - c));
int minimum_steps = Math.Min(2 * (n - 1) + m - 1,
2 * (m - 1) + n - 1);
return minimum_steps + corner_steps_req;
}
public static void Main(String[] args)
{
int n = 3;
int m = 2;
int r = 1;
int c = 1;
Console.Write(min_steps_required(n, m, r, c));
}
}
|
Javascript
<script>
function min_steps_required( n, m, r, c)
{
var i, j;
var corner_steps_req = Number.MAX_VALUE;
i = 1;
j = 1;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) +
Math.abs(j - c));
i = n;
j = 1;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) +
Math.abs(j - c));
i = 1;
j = m;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) +
Math.abs(j - c));
i = n;
j = m;
corner_steps_req = Math.min(corner_steps_req,
Math.abs(r - i) +
Math.abs(j - c));
var minimum_steps = Math.min(2 * (n - 1) + m - 1,
2 * (m - 1) + n - 1);
return minimum_steps + corner_steps_req;
}
var n = 3;
var m = 2;
var r = 1;
var c = 1;
document.write(min_steps_required(n, m, r, c));
</script>
|
Time complexity: O(1)
Auxiliary space: O(1)
Share your thoughts in the comments
Please Login to comment...