2577. Temps minimum pour visiter une cellule dans une grille
difficulté: dur
sujets: array, largeur de recherche, graphique, tas (file d'attente de priorité), matrice, chemin le plus court
vous avez une grille de matrice M x n composée de entières non négatives où le grille [row] [col] représente le temps minimum pour pouvoir visiter la cellule (ligne, col), ce qui signifie que vous pouvez visiter la cellule (ligne, col) uniquement lorsque Vous êtes debout dans la cellule
top-leftde la matrice dans la seconde 0 th , et vous devez passer à toute cellule adjacente dans les quatre directions: up, bas, gauche, et droit. Chaque mouvement que vous faites prend 1 seconde. return
le tempsminimum requis dans lequel vous pouvez visiter la cellule inférieure droite de la matrice. Si vous ne pouvez pas visiter la cellule inférieure droite, retournez -1 .
Exemple 1:
m == grid.length
essayez d'utiliser un algorithme qui peut trouver les chemins les plus courts d'un graphique.
Nous pouvons appliquer une version modifiée de
algorithme de Dijkstraen utilisant une file d'attente de priorité . Ce problème nous demande essentiellement de trouver le temps le plus court nécessaire pour visiter la cellule inférieure à droite à partir de la cellule supérieure gauche, où chaque mouvement a une contrainte de temps basée sur les valeurs de la grille. Approche:
: Traitez chaque cellule de la grille comme un nœud. Les bords sont les cellules adjacentes (en haut, en bas, à gauche, à droite) que vous pouvez vous déplacer.
: utilisez une file d'attente prioritaire pour toujours explorer la cellule avec le moins de temps requis. Cela garantit que nous traitons les cellules dans l'ordre des premiers temps que nous pouvons les atteindre.
: Pour chaque cellule, nous vérifierons si nous pouvons nous déplacer vers ses cellules voisines et mettre à jour l'heure à laquelle nous pouvons les visiter. Si une cellule est visitée plus tard que le courant, nous l'ajoutons dans la file d'attente avec le nouveau temps.
: Une fois que nous atteignons la cellule inférieure droite, nous pouvons retourner le temps. Si nous épuisons la file d'attente sans l'atteindre, retournez -1.
php
/ **
* @param entier [] [] $ grille
* @return entier
* /
fonction minimum temps ($ grid) {
...
...
...
/ **
* Allez sur ./solution.php
* /
}
// Exemple 1
$ grid1 = [
[0, 1, 3, 2],
[5, 1, 2, 5],
[4, 3, 8, 6]
]]
Echo Minimumtime ($ GRID1). Php_eol; // Sortie: 7
// Exemple 2
$ grid2 = [
[0, 2, 4],
[3, 2, 1],
[1, 0, 4]
]]
Echo Minimumtime ($ GRID2). Php_eol; // Sortie: -1
?>
:
La SPLPriorityqueue est utilisée pour garantir que les cellules avec le temps minimum sont traitées en premier. La priorité est stockée comme -Time car SPLPriorityQueue de PHP est un max-heap par défaut.
:
À partir de la cellule supérieure gauche (0, 0), l'algorithme traite toutes les cellules accessibles, compte tenu des premières fois où chacune peut être visitée (max (0, grille [newrow] [newcol] - (temps 1))).
:
Un tableau visité garde une trace des cellules qui ont déjà été traitées pour éviter les calculs redondants et les boucles infinies.
:
L'algorithme garantit que nous restons dans les limites de la grille et ne traite que les voisins valides.
:
Chaque mouvement prend une seconde, et si la cellule nécessite d'attendre (c'est-à-dire Grid [newrow] [newcol]> temps 1), l'algorithme attend jusqu'au moment requis.
:
Si la file d'attente est épuisée et que la cellule inférieure droite n'est pas atteinte, la fonction renvoie -1.
:
Chaque cellule est ajoutée à la file d'attente prioritaire au plus une fois:L'espace pour la file d'attente prioritaire et le tableau visité est
$grid = [ [0, 1, 3, 2], [5, 1, 2, 5], [4, 3, 8, 6] ]; echo minimumTime($grid); // Output: 7$ grid = [ [0, 2, 4], [3, 2, 1], [1, 0, 4] ]] Echo Minimumtime ($ Grid); // Sortie: -1
$grid = [ [0, 2, 4], [3, 2, 1], [1, 0, 4] ]; echo minimumTime($grid); // Output: -1
liens de contact
Si vous avez trouvé cette série utile, veuillez envisager de donner le référentiel
une étoile sur GitHub ou de partager le message sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi!Si vous voulez un contenu plus utile comme celui-ci, n'hésitez pas à me suivre:
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3