-4
votes

Java Lisez le fichier texte avec le labyrinthe et obtenez tous les chemins possibles

Edit: J'ai essayé de stocker le caractère des lignes par caractère dans un tableau 2D.

Cependant, le problème est de récupérer tous les chemins possibles d'un labyrinthe de 0 à 1 à l'intérieur d'un fichier texte. Et l'astérisque sont les murs ou l'obstacle.

labyrinthe ressemble à ceci xxx

Je ne sais pas si c'est réalisable de le mettre en deux dimensions Array String. Et faire une récursion ou une programmation dynamique par la suite.

Notez que les seuls mouvements autorisés sont corrects et bas, la destination 0 pourrait être quelque part sur le 2e, 3ème et ainsi de suite sur la colonne. Même chose que 1 destination.

Tous les astuces ou suggestions seront appréciés, merci d'avance!


11 commentaires

Réalisable? Oui. Qu'avez-vous essayé, de commencer avec?


J'en ai commencé à utiliser InputStreamreader où il s'agit de caractère de lecture par caractère à partir d'un fichier texte jusqu'à ce qu'il atteigne -1 . Itération ou lecture du fichier texte n'est pas le problème majeur pour moi, je pense, mais je me demande si après avoir lu le dossier, comment puis-je le mettre comme une carte où je peux faire déclarations conditionnelles .


Peut-être qu'il est plus facile de lire la ligne par ligne, puis ajoutez les lignes dans une arraylist


Si je l'ai lu ligne par ligne, comment puis-je vérifier si cela frappe l'obstacle? De plus, la partie délicate ici est que le seul mouvement autorisé est juste et descendu. La raison pour laquelle je pense que 2D est de l'incrémenter comme mes coordonnées. Ce qui est dans mon esprit, c'est de lire le fichier texte une fois, enregistrez-le comme carte, de sorte que le programme sache où l'origine Origine et destination et de là, je peux incrémenter le < I> Index et effectuez des déclarations conditionnelles le long de la course. Mais c'est ce que c'est dans mon esprit, je ne sais tout simplement pas comment mapper cela comme si j'ai le contrôle de chaque index à l'intérieur du mur.


@TUTURETOOKGAMING Il est très difficile de comprendre ce que vous dites, pouvez-vous me procurer la question exactement. Quelle est l'entrée et quelle est la sortie attendue?


@Vishwaratna essentiellement, j'essaie de lire un fichier texte qui a un format à l'intérieur comme ci-dessus. La première ligne est la hauteur et la largeur du mur. L'objectif principal de ce programme est d'obtenir tous les chemins d'origine d'origine 0 à destination * 1 sans passer à travers le mur, seulement autorisé à passer à droite et à descendre. Et comme vous pouvez le constater, il y a un obstacle aussi bien à l'intérieur du mur où vous devez éviter. Donc, l'entrée est le fichier texte et la sortie attendue n'est que le nombre de chemins possibles. Merci


La limite est-elle cohérente? C'est-à-dire que nous aurons toujours une limite uniforme de 1 * N et N * 1 dans toutes les directions ou peut-il varier?


@scissorhands Oui La limite est cohérente, de sorte qu'il agit comme un mur. Et le 0 et 1 pourrait être à différents endroits.


Je pense que vous devez créer une classe, par exemple appelé comme labyrinthe. Il doit avoir une matrice de chaîne ou de chaîne de chaîne et, après, vous devez mettre en place une getXy de ligne de fonction (int, int). Vous pouvez mettre en œuvre plus de méthodes telles que déménager ou endgamedection dans cette classe.


Vous ne voulez pas lire des trucs d'un fichier et le mettre dans un tableau. Vous voulez que quelqu'un implémente une recherche de chemin. Qu'avez-vous essayé?


J'ai déjà essayé de mettre le caractère de ligne par caractère dans une matrice 2D, seul problème est maintenant d'obtenir tous les chemins possibles du labyrinthe. Aller de 0 à 1 n'est pas un problème maintenant.


4 Réponses :


-1
votes
private char[][] maze;

private void read() {
    final InputStream inputStream = YourClass.class.getResourceAsStream(INPUT_PATH);
    final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

    try {
        final String header = reader.readLine();
        final String[] tokens = header.split(",");
        if (tokens.length < 2) {
            throw new RuntimeException("Invalid header"); // Use a dedicated exception
        }

        final int dimX = parseInt(tokens[0]);
        final int dimY = parseInt(tokens[1]);
        maze = new char[dimX][dimY];

        for (int i = 0; i < dimY; i++) {
            final String line = reader.readLine();
            maze[i] = line.toCharArray();
        }

    } catch (final IOException e) {
        // handle exception
    } finally {
        try {
            reader.close();
        } catch (IOException e) {
            // handle exception
        }
    }
}
Now, some assumptions: I assumed the first line contains the declaration of the maze size, so it will be used to initialize the two dimensional array. The other assumption is that you can make use of a char array, but that's pretty easy to change if you want.From here you can start working on your path finding algorithm.By the way, this thing you're trying to implement reminds me a lot of this challenge in the Adventofcode challenge series. There are a lot of people discussing their solutions to the challenge, just have a look in Reddit for instance and you'll find plenty oh tips on how to go on with your little experiment.Have fun!

1 commentaires

En fait, j'aime cette réponse, en lisant le fichier texte et mettez en 2D de tableau de caractères. Cependant, j'ai des problèmes maintenant pour obtenir tous les chemins possibles de 0 à 1 . Oui, je peux me rendre facilement de 0 à 1, mais je ne peux pas penser à un algorithme pour obtenir tous les chemins possibles tout en restant à l'intérieur des murs.



1
votes

Yep, c'est assez facile à faire:

  1. Lisez la première ligne du fichier texte et analysez les dimensions.
  2. créer un tableau de longueur n.
  3. pour chaque article (vide) dans le tableau:
    1. créer un nouveau réseau de longueur-n comme données.
    2. Analysez la ligne suivante du fichier texte en tant que caractères individuels dans le tableau.

      Après cela, vous aurez votre structure de données N x N pour terminer votre jeu avec.


0 commentaires

0
votes

Utiliser une carte pour stocker ce fichier semble être une bonne idée. Bien que je ne pense pas que la lecture d'un caractère de fichier par caractère serait un problème, xxx

vous avez spécifié les dimensions de la grille dire (n x n) Un moyen simple que je puisse visualiser consiste à générer des clés uniques pour chaque coordonnée. Plus comme une méthode d'analyseur pour stocker les touches sur la carte: xxx

donc lorsque vous lisez fichier par des caractères, vous pouvez mettre des coordonnées analysées sous forme de clés La carte: xxx


2 commentaires

Cela signifie-t-il que chaque personnage qui stocké dans HASHMAP aura ses propres clés uniques non? Mais la chose est, comment le programme saura-t-il si les coordonnées ont été suivies? J'aime calculer tous les chemins possibles vers la destination.


En fait, je n'ai pas assumé des opérations directes sur le hashmap. Il était destiné à rendre cela simple et accepte des cartes rares comme celle que vous avez spécifiée. Vous pouvez essayer une structure graphique similaire pour les traversées. Vous devrez faire une première travertielle de profondeur.



0
votes

Je suppose que le problème seul problème em> Vous êtes confronté, c'est décider comment lire correctement le fichier pour traiter ou appliquer l'algorithme pour déterminer le nombre de chemins uniques dans le labyrinthe donné.

    private static int[][] getMatrixFromFile(File f) throws IOException {
            //Read the input file as a list of String lines
            List<String> lines = Files.lines(f.toPath())
                    //.map(line -> line.substring(1 , line.length() - 1))
                    .collect(Collectors.toList());
            //Get the dimensions of the maze from the first line
            String[] dimensions = lines.get(0).split("\\*");

            //initalize a sub matrix of just the maze dimensions ignoring the walls
            int[][] mat = new int[Integer.valueOf(dimensions[0]) - 2 ][Integer.valueOf(dimensions[1]) - 2];

//for each line in the maze excluding the boundaries , if you encounter a * encode as 0 else 1
            for( int i = 2 ; i < lines.size() - 1  ; i++) {
                String currLine = lines.get(i);
                int j = 0;
                for(char c : currLine.toCharArray())
                        mat[i - 2][j] = (c == '*') ? 0 : 1;
            }

            return mat;
        }


5 commentaires

Pouvez-vous inclure le bit pour déterminer le nombre de chemins uniques de l'origine à destination? Aussi, j'ai commenté de ce qui précède que le 0 et 1 peut changer la position, c'est-à-dire que 0 peut être à l'index [2] ou [3]. . En fait, je veux voir comment vous le faites en utilisant dp au lieu de la récursion (ce que je pense). Acclamations!


Le nombre de chemins unique d'origine à destination est l'infini. Vous pouvez marcher autant de cercles que vous le souhaitez jusqu'à ce que vous décidiez d'aller au but.


Je ne pense pas que c'est l'infini, le seul mouvement que vous êtes autorisé à atteindre la destination. Même si le point de départ 0 est sur la troisième colonne, il ne devrait que bouger à droite ou en bas et ne peut pas aller à gauche.


Ohh, j'ai raté cette déclaration dans votre question. Attendez, il ne demande que de mettre ce fichier dans une structure de données.


C'est mon mauvais, j'ai édité ma question maintenant.