📌  相关文章
📜  跳跃等于单元格值到达目的地所需的最小单元格

📅  最后修改于: 2021-04-27 18:11:00             🧑  作者: Mango

给定amxn矩阵mat [] []包含正整数。问题是要遵循给定的约束,从像元(0,0)到达像元(m-1,n-1)。从一个单元格(i,j),只有在移动到以下位置时,才能“精确”移动“ mat [i] [j]”到右边(在同一行)或到下面(在同一列)。矩阵边界内的一个单元。
例如:给定mat [1] [1] = 4,则只有在矩阵中存在这些单元格的情况下,它们才能移动到单元格mat [1] [5]和mat [5] [1]。遵循约束条件,检查是否可以从(0,0)到达单元(m-1,n-1)。 1如果可以到达,则打印移动期间需要盖的最小单元数,否则打印“ -1”。

例子:

Input : mat[][] = { {2, 3, 2, 1, 4},
                    {3, 2, 5, 8, 2},
                    {1, 1, 2, 2, 1}  }
Output : 4
The movement and cells covered are as follows:
(0, 0)->(0, 2)
          |
        (2, 2)->(2, 4)

Input : mat[][] = { {2, 4, 2},
                {5, 3, 8},
            {1, 1, 1} }
Output : 3

算法:下面给出了一种动态编程方法:

下面是上述方法的实现:

C++
// C++ implementation to count minimum cells required
// to be covered to reach destination
#include 
  
using namespace std;
  
#define SIZE 100
  
// function to count minimum cells required
// to be covered to reach destination
int minCells(int mat[SIZE][SIZE], int m, int n)
{
    // to store min cells required to be
    // covered to reach a particular cell
    int dp[m][n];
  
    // initially no cells can be reached
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            dp[i][j] = INT_MAX;
  
    // base case
    dp[0][0] = 1;
  
    // building up the dp[][] matrix
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
  
            // dp[i][j] != INT_MAX denotes that cell (i, j)
            // can be reached from cell (0, 0) and the other
            // half of the condition finds the cell on the
            // right that can be reached from (i, j)
            if (dp[i][j] != INT_MAX && (j + mat[i][j]) < n
                && (dp[i][j] + 1) < dp[i][j + mat[i][j]])
                dp[i][j + mat[i][j]] = dp[i][j] + 1;
  
            // the other half of the condition finds the cell
            // right below that can be reached from (i, j)
            if (dp[i][j] != INT_MAX && (i + mat[i][j]) < m
                && (dp[i][j] + 1) < dp[i + mat[i][j]][j])
                dp[i + mat[i][j]][j] = dp[i][j] + 1;
        }
    }
  
    // it true then cell (m-1, n-1) can be reached
    // from cell (0, 0) and returns the minimum
    // number of cells covered
    if (dp[m - 1][n - 1] != INT_MAX)
        return dp[m - 1][n - 1];
  
    // cell (m-1, n-1) cannot be reached from
    // cell (0, 0)
    return -1;
}
  
// Driver program to test above
int main()
{
    int mat[SIZE][SIZE] = { { 2, 3, 2, 1, 4 },
                            { 3, 2, 5, 8, 2 },
                            { 1, 1, 2, 2, 1 } };
  
    int m = 3, n = 5;
    cout << "Minimum number of cells = "
         << minCells(mat, m, n);
  
    return 0;
}


Java
// Java implementation to count minimum
// cells required to be covered to reach
// destination
class MinCellsDestination
{
    static final int SIZE=100;
     
    // function to count minimum cells required
    // to be covered to reach destination
    static int minCells(int mat[][], int m, int n)
    {
        // to store min cells required to be
        // covered to reach a particular cell
        int dp[][] = new int[m][n];
        
        // initially no cells can be reached
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                dp[i][j] = Integer.MAX_VALUE;
        
        // base case
        dp[0][0] = 1;
        
        // building up the dp[][] matrix
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
        
                // dp[i][j] != INT_MAX denotes that cell
                // (i, j) can be reached from cell (0, 0)
                // and the other half of the condition
                // finds the cell on the right that can
                // be reached from (i, j)
                if (dp[i][j] != Integer.MAX_VALUE && 
                   (j + mat[i][j]) < n && (dp[i][j] + 1)
                   < dp[i][j + mat[i][j]])
                    dp[i][j + mat[i][j]] = dp[i][j] + 1;
        
                // the other half of the condition finds
                // the cell right below that can be 
                // reached from (i, j)
                if (dp[i][j] != Integer.MAX_VALUE && 
                   (i + mat[i][j]) < m && (dp[i][j] + 1)
                   < dp[i + mat[i][j]][j])
                    dp[i + mat[i][j]][j] = dp[i][j] + 1;
            }
        }
        
        // it true then cell (m-1, n-1) can be reached
        // from cell (0, 0) and returns the minimum
        // number of cells covered
        if (dp[m - 1][n - 1] != Integer.MAX_VALUE)
            return dp[m - 1][n - 1];
        
        // cell (m-1, n-1) cannot be reached from
        // cell (0, 0)
        return -1;
    }
      
    // Driver code
    public static void main(String args[])
    {
         int mat[][] = { { 2, 3, 2, 1, 4 },
                         { 3, 2, 5, 8, 2 },
                         { 1, 1, 2, 2, 1 }};
    
        int m = 3, n = 5;
        System.out.println("Minimum number of cells" +
                          " = " + minCells(mat, m, n));
    }
}
/* This code is contributed by Danish Kaleem */


Python3
# Python3 implementation to count minimum cells required 
# to be covered to reach destination 
SIZE=100 
MAX=10000000
# function to count minimum cells required 
# to be covered to reach destination 
def minCells( mat,  m,  n): 
    # to store min cells required to be 
    # covered to reach a particular cell 
    dp=[[MAX for i in range(n)]for i in range(m)] 
    
    # initially no cells can be reached 
      
    # base case 
    dp[0][0] = 1
    
    # building up the dp[][] matrix 
    for i in range(m):
        for j in range(n):  
            # dp[i][j] != MAX denotes that cell (i, j) 
            # can be reached from cell (0, 0) and the other 
            # half of the condition finds the cell on the 
            # right that can be reached from (i, j) 
            if (dp[i][j] != MAX and
             (j + mat[i][j]) < n and 
             (dp[i][j] + 1) < dp[i][j + mat[i][j]]): 
                dp[i][j + mat[i][j]] = dp[i][j] + 1
    
            # the other half of the condition finds the cell 
            # right below that can be reached from (i, j) 
            if (dp[i][j] != MAX and (i + mat[i][j]) < m 
                and (dp[i][j] + 1) < dp[i + mat[i][j]][j]):
                dp[i + mat[i][j]][j] = dp[i][j] + 1
  
    # it true then cell (m-1, n-1) can be reached 
    # from cell (0, 0) and returns the minimum 
    # number of cells covered 
    if (dp[m - 1][n - 1] != MAX):
        return dp[m - 1][n - 1] 
    
    # cell (m-1, n-1) cannot be reached from 
    # cell (0, 0) 
    return -1
    
# Driver program to test above 
mat= [ [ 2, 3, 2, 1, 4 ], 
       [ 3, 2, 5, 8, 2 ],
       [ 1, 1, 2, 2, 1 ]] 
    
m = 3
n = 5 
print("Minimum number of cells = ",
     minCells(mat, m, n))
#this code is contributed by sahilshelangia


C#
// C# implementation to count minimum
// cells required to be covered to reach
// destination
using System;
  
class GFG {
      
    //static int SIZE=100;
      
    // function to count minimum cells required
    // to be covered to reach destination
    static int minCells(int [,]mat, int m, int n)
    {
          
        // to store min cells required to be
        // covered to reach a particular cell
        int [,]dp = new int[m,n];
      
        // initially no cells can be reached
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                dp[i,j] = int.MaxValue;
      
        // base case
        dp[0,0] = 1;
      
        // building up the dp[][] matrix
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
      
                // dp[i][j] != INT_MAX denotes that
                // cell (i, j) can be reached from
                // cell (0, 0) and the other half
                // of the condition finds the cell
                // on the right that can be reached
                // from (i, j)
                if (dp[i,j] != int.MaxValue && 
                (j + mat[i,j]) < n && (dp[i,j] + 1)
                < dp[i,j + mat[i,j]])
                    dp[i,j + mat[i,j]] = dp[i,j] + 1;
      
                // the other half of the condition
                // finds the cell right below that
                // can be reached from (i, j)
                if (dp[i,j] != int.MaxValue && 
                (i + mat[i,j]) < m && (dp[i,j] + 1)
                < dp[i + mat[i,j],j])
                    dp[i + mat[i,j],j] = dp[i,j] + 1;
            }
        }
      
        // it true then cell (m-1, n-1) can be
        // reached from cell (0, 0) and returns
        // the minimum number of cells covered
        if (dp[m - 1,n - 1] != int.MaxValue)
            return dp[m - 1,n - 1];
      
        // cell (m-1, n-1) cannot be reached from
        // cell (0, 0)
        return -1;
    }
      
    // Driver code
    public static void Main()
    {
        int [,]mat = { { 2, 3, 2, 1, 4 },
                       { 3, 2, 5, 8, 2 },
                       { 1, 1, 2, 2, 1 } };
  
        int m = 3, n = 5;
        Console.WriteLine("Minimum number of "
            + "cells = " + minCells(mat, m, n));
    }
}
  
// This code is contributed by anuj_67.


PHP


输出:

Minimum number of cells = 4

时间复杂度:O(m * n)
辅助空间:O(m * n)