Comment éviter une boucle infinie dans BFS?

Wentao Wang:

Voici le problème LeetCode 542. 01 Matrix

Mon code créera une boucle infinie car il poussera toutes les directions dans la file d'attente, même si ce nœud a déjà été visité. Je ne peux pas penser à un moyen de résoudre ce problème. Quelqu'un pourrait-il aider?

class Solution {
int[][] dirs = { {0,1},{0,-1},{1,0},{-1,0} };
public int[][] updateMatrix(int[][] matrix) {
    for(int i=0;i < matrix.length;i++){
        for(int j=0; j < matrix[i].length;j++){
            if(matrix[i][j] == 1)
                matrix[i][j] = Integer.MAX_VALUE;
                BFS(new int[]{i,j},matrix);
        }
    }        
    return matrix;
}

public void BFS(int[] node,int[][] matrix){
    if(matrix[node[0]][node[1]] == 0)
        return;
    LinkedList<int[]> queue = new LinkedList<>();
    queue.push(node);
    int step = 1;
    while(!queue.isEmpty()){
        int[] temp = queue.poll();
        if(temp == null){
            step++;
            continue;
        }
        for(int[] dir:dirs){
            int r = temp[0] + dir[0];
            int c = temp[1] + dir[1];
            if(r < 0 || c < 0 || r >= matrix.length || c >= matrix[r].length)
                continue;
            queue.push(new int[] {r,c});
            if(matrix[r][c] == 0){
                matrix[temp[0]][temp[1]] = Math.min(step,matrix[temp[0]][temp[1]]);
            }
        }
        queue.push(null);
    }
    return;
}
} 
Maurice Perry:

Vous devez garder une trace des nœuds qui ont déjà été visités. Vous pouvez soit conserver les nœuds dans la liste, soit les déplacer vers un autre Set.

Le problème que vous rencontrez ici est que les nœuds sont des tableaux et que vous ne pouvez pas les utiliser dans un fichier HashSet. Je commencerais par déclarer une classe Coordinates:

public class Coordinates {
    public final int row;
    public final int col;

    public Coordinates(int r, int c) {
        this.row = r;
        this.col = c;
    }

    @Override
    public int hashCode() {
        return (row + 37*col) & 0x7FFFFFFF;
    }

    @Override
    public boolean equals(Object other) {
        if (other == null || other.getClass() != getClass()) {
            return false;
        }
        Coordinates o = (Coordinates)other;
        return row == o.row && col == o.col;
    }
}

Option 1: garder les nœuds dans la file d'attente

Je n'ai pas compris le but d'ajouter des nulls dans la file d'attente; Je viens de supprimer ceci.

public void BFS(Coordinates node,int[][] matrix){
    if(matrix[node.row][node.col] == 0)
        return;
    List<Coordinates> queue = new ArrayList<>();
    queue.add(node);
    for (int i = 0; i < queue.size(); ++i) {
        Coordinates temp = queue.get(i);
        for(int[] dir:dirs){
            int r = temp.row + dir.row;
            int c = temp.col + dir.col;
            if(r < 0 || c < 0 || r >= matrix.length || c >= matrix[r].length)
                continue;
            Coordinates newCoord = new Coordinates(r, c);
            if (!queue.contains(newCoord)) {
                queue.add(newCoord);
            }
            if(matrix[r][c] == 0){
                matrix[temp.row][temp.col] = Math.min(step,matrix[temp.row][temp.col]);
            }
        }
    }
    return;
}

Option 2: utiliser un Set

Maintenant que nous avons hashCodeune equalsméthode et une , pourquoi ne pas utiliser une HashSet?

Je laisserai cela comme un exercice.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

zeromq: comment éviter une attente infinie?

Comment interrompre une boucle infinie

Comment éviter une boucle infinie lors de la création d'un planificateur

Comment éviter une boucle infinie dans le modèle Observer?

Comment trouver une boucle infinie dans une application Web Java?

Comment éviter l'erreur "variable inutilisée dans une boucle for"

Comment éviter une boucle de récursivité infinie

Boucle infinie dans ma fonction BFS

Comment éviter la récursivité infinie lors de la création d'une boucle d'événements dans Ruby?

Comment détecter et éviter une boucle infinie en PHP

Puissance avec arithmétique successeur - comment éviter une boucle infinie? [Prolog]

Comment arrêter un déclencheur dans une boucle infinie?

Comment créer une boucle infinie dans NodeJS

Pyqt5 Comment éviter de geler le programme par une boucle while infinie?

Comment éviter une boucle infinie lors de la mise à jour de soi dans un BehaviorSubject?

Comment interrompre une boucle infinie dans Prolog

Comment éviter une boucle infinie dans l'observateur vue.js et socket.io

Comment éviter que PyQt Line Edit et Message Box ne soient bloqués dans une boucle infinie?

Comment éviter une boucle infinie dans le fichier de commandes Windows pour la commande in do?

Comment résoudre une erreur de boucle infinie dans reactjs?

Comment éviter une boucle infinie avec useEffect dans ce cas? (Réagir)

Comment éviter une boucle infinie avec deux widgets qui se mettent à jour?

Comment éviter une boucle infinie lors de l'utilisation de l'état Redux dans le tableau de dépendances useEffect?

Comment éviter le rendu d'une boucle infinie à partir de l'écouteur d'événements (React)

Comment faire une boucle infinie dans un tableau en javascript?

ordonnancement python - Comment puis-je éviter la boucle infinie?

Comment éviter le blocage de code dans une boucle

Comment réécrire les chemins d'URL dans Apache pour éviter une boucle infinie

Comment éviter le recalcul dans une boucle dans Tensorflow

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive