Verifique si existe una ruta desde el principio hasta el final de la celda en Matrix dada con obstáculos en la mayoría de los movimientos K

Dado un entero positivo K y una cuadrícula matricial de dimensiones N * M que consta de caracteres ‘.’ y ‘#’ , donde ‘.’ representa las celdas desbloqueadas y ‘#’ representa las celdas bloqueadas, la tarea es verificar si se puede llegar a la parte inferior derecha de la cuadrícula desde la celda superior izquierda de la array a través de celdas desbloqueadas en un máximo de K movimientos o no, de modo que se necesita un movimiento para moverse a su celda adyacente en la dirección derecha o hacia abajo.

Ejemplos:

Entrada: cuadrícula[][] = {{‘.’, ‘.’, ‘.’}, {‘#’, ‘.’, ‘.’}, {‘#’, ‘#’, ‘.’} }, K = 4
Salida:
Explicación: Es posible llegar a la celda inferior derecha de la cuadrícula dada utilizando el siguiente conjunto de movimientos: derecha -> abajo -> derecha -> abajo. Por lo tanto, el número de movimientos requeridos es 4, que es el mínimo posible y es menor que K.

Entrada: cuadrícula[][] = {{‘.’, ‘.’, ‘.’, ‘.’}, {‘.’, ‘.’, ‘.’, ‘.’}, {‘#’, ‘#’, ‘#’, ‘#’}, {‘.’, ‘.’, ‘.’, ‘.’}}, K = 4
Salida: No
Explicación: No hay un conjunto posible de movimientos para alcanzar el celda inferior derecha de la celda superior izquierda de la array dada.

Enfoque: el problema dado se puede resolver con la ayuda de la programación dinámica mediante el uso de un enfoque de tabulación . Se puede resolver calculando previamente la cantidad mínima de movimientos necesarios para pasar de la celda superior izquierda a la celda inferior derecha utilizando un enfoque similar al que se analiza en este artículo. Se puede observar que si dp[i][j] representa el número mínimo de movimientos para llegar a la celda (i, j) desde (0, 0) , entonces la relación DP se puede formular de la siguiente manera:

dp[i][j] = min(dp[i][j], 1 + dp[i – 1][j], 1+ dp[i][j – 1]))

A partir de entonces, si el número mínimo de movimientos es como máximo K , imprima «Sí», de lo contrario imprima «No». 

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ implementation for the above approach
#include "bits/stdc++.h"
using namespace std;
 
// Function to check if it is possible
// to reach the bottom right of the grid
// from top left using atmost K moves
string canReach(vector<vector<char> >& grid, int K)
{
    int N = grid.size();
    int M = grid[0].size();
 
    // Stores the DP states
    vector<vector<long long> > dp(
        N, vector<long long>(M, INT_MAX));
     
      // if first cell or last cell is blocked then
    // not possible
    if(grid[0][0] != '.' || grid[N - 1][M - 1] != '.')
      return "No";
   
    // Initial condition
    dp[0][0] = 0;
 
    // Initializing the DP table
    // in 1st row
    for (int i = 1; i < M; i++) {
        if (grid[0][i] == '.') {
            dp[0][i] = 1 + dp[0][i - 1];
        }
        else
            break;
    }
 
    // Initializing the DP table
    // in 1st column
    for (int i = 1; i < N; i++) {
        if (grid[i][0] == '.') {
            dp[i][0] = 1 + dp[i - 1][0];
        }
        else
            break;
    }
 
    // Iterate through the grid
    for (int i = 1; i < N; i++) {
        for (int j = 1; j < M; j++) {
 
            // If current position
            // is not an obstacle,
            // update the dp state
            if (grid[i][j] == '.') {
                dp[i][j] = min(
                    dp[i][j],
                    1 + min(dp[i - 1][j],
                            dp[i][j - 1]));
            }
        }
    }
 
    // Return answer
    return (dp[N - 1][M - 1] <= K
                ? "Yes"
                : "No");
}
 
// Driver Code
int main()
{
    vector<vector<char> > grid
        = { { '.', '.', '.' },
           { '#', '.', '.' },
           { '#', '#', '.' } };
   
    int K = 4;
    cout << canReach(grid, K);
 
    return 0;
}

Java

// Java implementation for the above approach
//include "bits/stdJava.h"
import java.util.*;
 
class GFG
{
 
// Function to check if it is possible
// to reach the bottom right of the grid
// from top left using atmost K moves
static String canReach(char[][] grid, int K)
{
    int N = grid.length;
    int M = grid[0].length;
 
    // Stores the DP states
    int[][] dp = new int[N][M];
    for(int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++) {
            dp[i][j] = Integer.MAX_VALUE;
        }
    }
   
    // if first cell or last cell is blocked then
    // not possible
    if(grid[0][0] != '.' || grid[N - 1][M - 1] != '.') return "No";
   
    // Initial condition
    dp[0][0] = 0;
 
    // Initializing the DP table
    // in 1st row
    for (int i = 1; i < M; i++) {
        if (grid[0][i] == '.') {
            dp[0][i] = 1 + dp[0][i - 1];
        }
        else
            break;
    }
 
    // Initializing the DP table
    // in 1st column
    for (int i = 1; i < N; i++) {
        if (grid[i][0] == '.') {
            dp[i][0] = 1 + dp[i - 1][0];
        }
        else
            break;
    }
 
    // Iterate through the grid
    for (int i = 1; i < N; i++) {
        for (int j = 1; j < M; j++) {
 
            // If current position
            // is not an obstacle,
            // update the dp state
            if (grid[i][j] == '.') {
                dp[i][j] = Math.min(
                    dp[i][j],
                    1 + Math.min(dp[i - 1][j],
                            dp[i][j - 1]));
            }
        }
    }
 
    // Return answer
    return (dp[N - 1][M - 1] <= K
                ? "Yes"
                : "No");
}
 
// Driver Code
public static void main(String[] args)
{
    char[][] grid
        = { { '.', '.', '.' },
           { '#', '.', '.' },
           { '#', '#', '.' } };
   
    int K = 4;
    System.out.print(canReach(grid, K));
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 implementation for the above approach
INT_MAX = 2147483647
 
# Function to check if it is possible
# to reach the bottom right of the grid
# from top left using atmost K moves
def canReach(grid, K):
     
    N = len(grid)
    M = len(grid[0])
 
    # Stores the DP states
    dp = [[INT_MAX for _ in range(M)]
                   for _ in range(N)]
     
    # if first cell or last cell is blocked then
    # not possible
    if(grid[0][0] != '.' or grid[N - 1][M - 1] != '.'):
      return("No")
   
    # Initial condition
    dp[0][0] = 0
 
    # Initializing the DP table
    # in 1st row
    for i in range(1, M):
        if (grid[0][i] == '.'):
            dp[0][i] = 1 + dp[0][i - 1]
        else:
            break
         
    # Initializing the DP table
    # in 1st column
    for i in range(1, N):
        if (grid[i][0] == '.'):
            dp[i][0] = 1 + dp[i - 1][0]
        else:
            break
 
    # Iterate through the grid
    for i in range(1, N):
        for j in range(1, M):
 
            # If current position
            # is not an obstacle,
            # update the dp state
            if (grid[i][j] == '.'):
                dp[i][j] = min(dp[i][j],
                       1 + min(dp[i - 1][j],
                               dp[i][j - 1]))
 
    # Return answer
    if dp[N - 1][M - 1] <= K:
        return("Yes")
    else:
        return("No")
 
# Driver Code
if __name__ == "__main__":
 
    grid = [ [ '.', '.', '.' ],
             [ '#', '.', '.' ],
             [ '#', '#', '.' ] ]
    K = 4
     
    print(canReach(grid, K))
 
# This code is contributed by rakeshsahni

C#

// C# implementation for the above approach
//include "bits/stdJava.h"
using System;
 
class GFG
{
 
// Function to check if it is possible
// to reach the bottom right of the grid
// from top left using atmost K moves
static String canReach(char[,] grid, int K)
{
    int N = grid.GetLength(0);
    int M = grid.GetLength(1);
 
 
    // Stores the DP states
    int[,] dp = new int[N,M];
    for(int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++) {
            dp[i, j] = int.MaxValue;
        }
    }
     
    // if first cell or last cell is blocked then
    // not possible
    if(grid[0, 0] != '.' || grid[N - 1, M - 1] != '.') return "No";
   
    // Initial condition
    dp[0, 0] = 0;
 
    // Initializing the DP table
    // in 1st row
    for (int i = 1; i < M; i++) {
        if (grid[0, i] == '.') {
            dp[0, i] = 1 + dp[0, i - 1];
        }
        else
            break;
    }
 
    // Initializing the DP table
    // in 1st column
    for (int i = 1; i < N; i++) {
        if (grid[i, 0] == '.') {
            dp[i, 0] = 1 + dp[i - 1, 0];
        }
        else
            break;
    }
 
    // Iterate through the grid
    for (int i = 1; i < N; i++) {
        for (int j = 1; j < M; j++) {
 
            // If current position
            // is not an obstacle,
            // update the dp state
            if (grid[i, j] == '.') {
                dp[i, j] = Math.Min(
                    dp[i, j],
                    1 + Math.Min(dp[i - 1, j],
                            dp[i, j - 1]));
            }
        }
    }
 
    // Return answer
    return (dp[N - 1, M - 1] <= K
                ? "Yes"
                : "No");
}
 
// Driver Code
public static void Main()
{
    char[,] grid
        = { { '.', '.', '.' },
            { '/', '.', '.' },
            { '/', '/', '.' } };
    int K = 4;
    Console.Write(canReach(grid, K));
}
}
 
// This code is contributed by Saurabh jaiswal

Javascript

<script>
 
       // JavaScript Program to implement
       // the above approach
 
       // Function to check if it is possible
       // to reach the bottom right of the grid
       // from top left using atmost K moves
       function canReach(grid, K) {
           let N = grid.length;
           let M = grid[0].length;
 
           // Stores the DP states
           let dp = new Array(N);
           for (let i = 0; i < dp.length; i++) {
               dp[i] = new Array(M).fill(Number.MAX_VALUE);
           }
            
           // if first cell or last cell is blocked then
           // not possible
           if(grid[0][0] != '.' || grid[N - 1][M - 1] != '.') return "No";
    
           // Initial condition
           dp[0][0] = 0;
 
           // Initializing the DP table
           // in 1st row
           for (let i = 1; i < M; i++) {
               if (grid[0][i] == '.') {
                   dp[0][i] = 1 + dp[0][i - 1];
               }
               else
                   break;
           }
 
           // Initializing the DP table
           // in 1st column
           for (let i = 1; i < N; i++) {
               if (grid[i][0] == '.') {
                   dp[i][0] = 1 + dp[i - 1][0];
               }
               else
                   break;
           }
 
           // Iterate through the grid
           for (let i = 1; i < N; i++) {
               for (let j = 1; j < M; j++) {
 
                   // If current position
                   // is not an obstacle,
                   // update the dp state
                   if (grid[i][j] == '.') {
                       dp[i][j] = Math.min(
                           dp[i][j],
                           1 + Math.min(dp[i - 1][j],
                               dp[i][j - 1]));
                   }
               }
           }
 
           // Return answer
           return (dp[N - 1][M - 1] <= K
               ? "Yes"
               : "No");
       }
 
       // Driver Code
       let grid
           = [['.', '.', '.'],
           ['#', '.', '.'],
           ['#', '#', '.']];
       let K = 4;
       document.write(canReach(grid, K));
 
   // This code is contributed by Potta Lokesh
   </script>
Producción

Yes

Complejidad de tiempo : O (N * M), ya que estamos usando bucles anidados para atravesar N * M veces.

Espacio auxiliar : O (N * M), ya que estamos usando espacio adicional para la array dp.
 

Publicación traducida automáticamente

Artículo escrito por kartikey134 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *