Minimum steps to reach any of the boundary edges of a matrix | Set 1

Given an N X M matrix, where ai, j = 1 denotes the cell is not empty, ai, j = 0 denotes the cell is empty and ai, j = 2, denotes that you are standing at that cell. You can move vertically up or down and horizontally left or right to any cell which is empty. The task is to find the minimum number of steps to reach any boundary edge of the matrix. Print -1 if not possible to reach any of the boundary edges.

Note: There will be only one cell with value 2 in the entire matrix.

Examples:



Input: matrix[] = {1, 1, 1, 0, 1}
                  {1, 0, 2, 0, 1} 
                  {0, 0, 1, 0, 1}
                  {1, 0, 1, 1, 0} 
Output: 2
Move to the right and then move 
upwards to reach the nearest boundary
edge. 

Input: matrix[] = {1, 1, 1, 1, 1}
                  {1, 0, 2, 0, 1} 
                  {1, 0, 1, 0, 1}
                  {1, 1, 1, 1, 1}
Output: -1 

Approach: The problem can be solved using a Dynamic Programming approach. Given below is the algorithm to solve the above problem.

  • Find the position which has ‘2’ in the matrix.
  • Initialize two 2-D arrays of size same as the matrix. The dp[][] which stores the minimum number of steps to reach any index i, j and vis[][] marks if any particular i, j position has been visited or not previously.
  • Call the recursive function which has the base case as follows:
    1. if the traversal at any point reaches any of the boundary edges return 0.
    2. if the points position n, m has stored the minimum number of steps previously, then return dp[n][m].
  • Call the recursion again with all possible four moves that can be done from the position n, m. The moves are only possible if mat[n][m] is 0 and the position has not been visited previously.
  • Store the minimal of the four moves.
  • If the recursion returns any value less than 1e9, which we had stored as the maximum value, then there is an answer, else it does not have any answer.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find Minimum steps
// to reach any of the boundary
// edges of a matrix
#include <bits/stdc++.h>
using namespace std;
#define r 4
#define col 5
  
// Function to find out minimum steps
int findMinSteps(int mat[r][col], int n, int m, int dp[r][col], bool vis[r][col])
{
    // boundary edges reached
    if (n == 0 || m == 0 || n == (r - 1) || m == (col - 1)) {
        return 0;
    }
  
    // already had a route through this
    // point, hence no need to re-visit
    if (dp[n][m] != -1)
        return dp[n][m];
  
    // visiting a position
    vis[n][m] = true;
  
    int ans1, ans2, ans3, ans4;
  
    ans1 = ans2 = ans3 = ans4 = 1e9;
  
    // vertically up
    if (mat[n - 1][m] == 0) {
        if (!vis[n - 1][m])
            ans1 = 1 + findMinSteps(mat, n - 1, m, dp, vis);
    }
  
    // horizontally right
    if (mat[n][m + 1] == 0) {
        if (!vis[n][m + 1])
            ans2 = 1 + findMinSteps(mat, n, m + 1, dp, vis);
    }
  
    // horizontally left
    if (mat[n][m - 1] == 0) {
        if (!vis[n][m - 1])
            ans3 = 1 + findMinSteps(mat, n, m - 1, dp, vis);
    }
  
    // vertically down
    if (mat[n + 1][m] == 0) {
        if (!vis[n + 1][m])
            ans4 = 1 + findMinSteps(mat, n + 1, m, dp, vis);
    }
  
    // minimum of every path
    dp[n][m] = min(ans1, min(ans2, min(ans3, ans4)));
    return dp[n][m];
}
  
// Function that returns the minimum steps
int minimumSteps(int mat[r][col], int n, int m)
{
    // index to store the location at
    // which you are standing
    int twox = -1;
    int twoy = -1;
  
    // find '2' in the matrix
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (mat[i][j] == 2) {
                twox = i;
                twoy = j;
                break;
            }
        }
        if (twox != -1)
            break;
    }
  
    // Initialize dp matrix with -1
    int dp[r][col];
    memset(dp, -1, sizeof dp);
  
    // Initialize vis matrix with false
    bool vis[r][col];
    memset(vis, false, sizeof vis);
  
    // Call function to find out minimum steps
    // using memoization and recursion
    int res = findMinSteps(mat, twox, twoy, dp, vis);
  
    // if not possible
    if (res >= 1e9)
        return -1;
    else
        return res;
}
  
// Driver Code
int main()
{
    int mat[r][col] = { { 1, 1, 1, 0, 1 },
                      { 1, 0, 2, 0, 1 },
                      { 0, 0, 1, 0, 1 },
                      { 1, 0, 1, 1, 0 } };
  
    cout << minimumSteps(mat, r, col);
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find Minimum steps
// to reach any of the boundary
// edges of a matrix
class Solution
{
static final int  r=4,c=5;
  
// Function to find out minimum steps
static int findMinSteps(int mat[][], int n, int m, int dp[][], boolean vis[][])
{
    // boundary edges reached
    if (n == 0 || m == 0 || n == (r - 1) || m == (c - 1)) {
        return 0;
    }
   
    // already had a route through this
    // point, hence no need to re-visit
    if (dp[n][m] != -1)
        return dp[n][m];
   
    // visiting a position
    vis[n][m] = true;
   
    int ans1, ans2, ans3, ans4;
   
    ans1 = ans2 = ans3 = ans4 = (int)1e9;
   
    // vertically up
    if (mat[n - 1][m] == 0) {
        if (!vis[n - 1][m])
            ans1 = 1 + findMinSteps(mat, n - 1, m, dp, vis);
    }
   
    // horizontally right
    if (mat[n][m + 1] == 0) {
        if (!vis[n][m + 1])
            ans2 = 1 + findMinSteps(mat, n, m + 1, dp, vis);
    }
   
    // horizontally left
    if (mat[n][m - 1] == 0) {
        if (!vis[n][m - 1])
            ans3 = 1 + findMinSteps(mat, n, m - 1, dp, vis);
    }
   
    // vertically down
    if (mat[n + 1][m] == 0) {
        if (!vis[n + 1][m])
            ans4 = 1 + findMinSteps(mat, n + 1, m, dp, vis);
    }
   
    // minimum of every path
    dp[n][m] = Math.min(ans1, Math.min(ans2, Math.min(ans3, ans4)));
    return dp[n][m];
}
   
// Function that returns the minimum steps
static int minimumSteps(int mat[][], int n, int m)
{
    // index to store the location at
    // which you are standing
    int twox = -1;
    int twoy = -1;
   
    // find '2' in the matrix
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (mat[i][j] == 2) {
                twox = i;
                twoy = j;
                break;
            }
        }
        if (twox != -1)
            break;
    }
   
    // Initialize dp matrix with -1
    int dp[][]=new int[r][r];
    for(int j=0;j<r;j++)
    for(int i=0;i<r;i++)dp[j][i]=-1;
   
    // Initialize vis matrix with false
    boolean vis[][]= new boolean[r][r];
    for(int j=0;j<r;j++)
    for(int i=0;i<r;i++)vis[j][i]=false;
   
    // Call function to find out minimum steps
    // using memoization and recursion
    int res = findMinSteps(mat, twox, twoy, dp, vis);
   
    // if not possible
    if (res >= 1e9)
        return -1;
    else
        return res;
}
   
// Driver Code
public static void main(String args[])
{
    int mat[][] = { { 1, 1, 1, 0, 1 },
                      { 1, 0, 2, 0, 1 },
                      { 0, 0, 1, 0, 1 },
                      { 1, 0, 1, 1, 0 } };
   
    System.out.println( minimumSteps(mat, r, c));
}
}
//contributed by Arnab Kundu

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to find Minimum steps
# to reach any of the boundary
# edges of a matrix
  
r=4
col=5
   
# Function to find out minimum steps
def findMinSteps(mat, n, m, dp,vis):
  
    # boundary edges reached
    if (n == 0 or m == 0 or n == (r - 1) or m == (col - 1)):
        return 0
      
   
    # already had a route through this
    # point, hence no need to re-visit
    if (dp[n][m] != -1):
        return dp[n][m]
   
    # visiting a position
    vis[n][m] = True
   
    ans1, ans2, ans3, ans4=10**9,10**9,10**9,10**9
  
   
    # vertically up
    if (mat[n - 1][m] == 0):
        if (vis[n - 1][m]==False):
            ans1 = 1 + findMinSteps(mat, n - 1, m, dp, vis)
      
   
    # horizontally right
    if (mat[n][m + 1] == 0):
        if (vis[n][m + 1]==False):
            ans2 = 1 + findMinSteps(mat, n, m + 1, dp, vis)
      
   
    # horizontally left
    if (mat[n][m - 1] == 0):
        if (vis[n][m - 1]==False):
            ans3 = 1 + findMinSteps(mat, n, m - 1, dp, vis)
      
   
    # vertically down
    if (mat[n + 1][m] == 0):
        if (vis[n + 1][m]==False):
            ans4 = 1 + findMinSteps(mat, n + 1, m, dp, vis)
      
   
    # minimum of every path
    dp[n][m] = min(ans1, min(ans2, min(ans3, ans4)))
    return dp[n][m]
  
   
# Function that returns the minimum steps
def minimumSteps(mat, n, m):
  
    # index to store the location at
    # which you are standing
    twox = -1
    twoy = -1
   
    # find '2' in the matrix
    for i in range(n): 
        for j in range(m): 
            if (mat[i][j] == 2):
                twox = i
                twoy = j
                break
              
          
        if (twox != -1):
            break
      
   
    # Initialize dp matrix with -1
    dp=[[-1 for i in range(col)] for i in range(r)]
      
   
    # Initialize vis matrix with false
    vis=[[False for i in range(col)] for i in range(r)]
      
   
    # Call function to find out minimum steps
    # using memoization and recursion
    res = findMinSteps(mat, twox, twoy, dp, vis)
   
    # if not possible
    if (res >= 10**9):
        return -1
    else:
        return res
  
   
# Driver Code
  
  
mat= [ [ 1, 1, 1, 0, 1 ],
      [ 1, 0, 2, 0, 1 ],
      [ 0, 0, 1, 0, 1 ],
      [ 1, 0, 1, 1, 0 ] ]
  
print(minimumSteps(mat, r, col))
  
#this is contributed by Mohit kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find Minimum steps 
// to reach any of the boundary 
// edges of a matrix
  
using System;
  
class Solution 
static int r=4,c=5; 
  
    // Function to find out minimum steps 
    static int findMinSteps(int [,]mat, int n, int m, int [,]dp, bool [,]vis) 
    
        // boundary edges reached 
        if (n == 0 || m == 0 || n == (r - 1) || m == (c - 1)) { 
            return 0; 
        
      
        // already had a route through this 
        // point, hence no need to re-visit 
        if (dp[n,m] != -1) 
            return dp[n,m]; 
      
        // visiting a position 
        vis[n,m] = true
      
        int ans1, ans2, ans3, ans4; 
      
        ans1 = ans2 = ans3 = ans4 = (int)1e9; 
      
        // vertically up 
        if (mat[n - 1,m] == 0) { 
            if (!vis[n - 1,m]) 
                ans1 = 1 + findMinSteps(mat, n - 1, m, dp, vis); 
        
      
        // horizontally right 
        if (mat[n,m + 1] == 0) { 
            if (!vis[n,m + 1]) 
                ans2 = 1 + findMinSteps(mat, n, m + 1, dp, vis); 
        
      
        // horizontally left 
        if (mat[n,m - 1] == 0) { 
            if (!vis[n,m - 1]) 
                ans3 = 1 + findMinSteps(mat, n, m - 1, dp, vis); 
        
      
        // vertically down 
        if (mat[n + 1,m] == 0) { 
            if (!vis[n + 1,m]) 
                ans4 = 1 + findMinSteps(mat, n + 1, m, dp, vis); 
        
      
        // minimum of every path 
        dp[n,m] = Math.Min(ans1, Math.Min(ans2, Math.Min(ans3, ans4))); 
        return dp[n,m]; 
    
      
    // Function that returns the minimum steps 
    static int minimumSteps(int [,]mat, int n, int m) 
    
        // index to store the location at 
        // which you are standing 
        int twox = -1; 
        int twoy = -1; 
      
        // find '2' in the matrix 
        for (int i = 0; i < n; i++) { 
            for (int j = 0; j < m; j++) { 
                if (mat[i,j] == 2) { 
                    twox = i; 
                    twoy = j; 
                    break
                
            
            if (twox != -1) 
                break
        
      
        // Initialize dp matrix with -1 
        int [,]dp = new int[r,r]; 
        for(int j=0;j<r;j++) 
            for(int i=0;i<r;i++)
                dp[j,i]=-1; 
      
        // Initialize vis matrix with false 
        bool [,]vis= new bool [r,r]; 
        for(int j=0;j<r;j++) 
            for(int i=0;i<r;i++)
                vis[j,i]=false
      
        // Call function to find out minimum steps 
        // using memoization and recursion 
        int res = findMinSteps(mat, twox, twoy, dp, vis); 
      
        // if not possible 
        if (res >= 1e9) 
            return -1; 
        else
            return res; 
    
      
    // Driver Code 
    public static void Main() 
    
        int [,]mat = { { 1, 1, 1, 0, 1 }, 
                        { 1, 0, 2, 0, 1 }, 
                        { 0, 0, 1, 0, 1 }, 
                        { 1, 0, 1, 1, 0 }, }; 
      
        Console.WriteLine(minimumSteps(mat, r, c)); 
    
    // This code is contributed by Ryuga
  

chevron_right


Output:

2

Time Complexity: O(N^2)
Auxiliary Space: O(N^2)

Minimum steps to reach any of the boundary edges of a matrix | Set-2



My Personal Notes arrow_drop_up

Striver(underscore)79 at Codechef and codeforces D

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.