【问题标题】:Java read text file with maze and get all possible paths [closed]Java用迷宫读取文本文件并获取所有可能的路径[关闭]
【发布时间】:2019-09-09 07:59:53
【问题描述】:

编辑:我尝试将行字符逐个字符存储到二维数组中。

但是,问题是在文本文件中获取从 01 的所有可能的迷宫路径。星号是墙壁或障碍物。

迷宫是这样的

8,8
********
*0     *
*      *
*  **  *
*  **  *
*      *
*     1*
********

我不确定是否可以将其放入二维数组字符串中。然后进行递归或动态规划。

请注意,唯一允许的移动是向右和向下,0 目的地也可能在第 2、第 3 等列的某个位置。也与 1 个目的地相同。

任何提示或建议将不胜感激,在此先感谢您!

【问题讨论】:

  • 可以实现吗?是的。你尝试过什么?
  • 我使用 InputStreamReader 启动它,它从文本文件中逐个字符地读取,直到达到 -1。我认为迭代或读取文本文件对我来说不是主要问题,但我想知道在我阅读文件之后,我怎样才能将它放入可以执行 条件语句的地图中>.
  • 可能更容易逐行阅读,然后将这些行添加到 ArrayList 中
  • 如果我逐行阅读,我如何检查它是否撞到了障碍物?此外,这里棘手的部分是唯一允许的运动是向右和向下。我想拥有 2D 的原因是将其增加为我的坐标。我的想法是,要读取一次文本文件,将其记录为地图,以便程序知道 origindestination 的位置,然后我可以从那里增加 index 并在运行过程中执行条件语句。但这就是我的想法,我只是不知道如何映射它,就像我控制了墙内的每个索引一样。
  • @tuturyokgaming 很难理解你在说什么,你能准确地给我这个问题吗?什么是输入,什么是预期输出。

标签: java algorithm java-io fileinputstream maze


【解决方案1】:

是的,这很容易做到:

  1. 读取文本文件的第一行并解析出尺寸。
  2. 创建一个长度为 n 的数组。
  3. 对于数组中的每个(空白)项:
    1. 创建一个新的长度为 n 的数组作为数据。
    2. 将文本文件的下一行作为单个字符解析到数组中。

在此之后,您将拥有 n x n 数据结构来完成您的游戏。

【讨论】:

    【解决方案2】:

    使用地图存储此文件似乎是个好主意。 虽然我认为逐个字符读取文件不是问题,

    BufferedReader br = new BufferedReader(new FileReader(file));
    String line = br.readLine();
    

    您已指定网格尺寸,例如 (n x n) 我可以想象的一种简单方法是为每个坐标生成唯一的键。 更像是在 Map 中存储 Keys 的 Parser 方法:

    public String parseCoordinate(int x, int y){
        return x + "" + y;
    }
    
    Map<String, Boolean> gridMap = new HashMap<>();
    

    因此,当您按字符阅读file 时,您可以将解析后的坐标作为键放在地图中:

    gridMap.put(parseCoordinate(lineCount, characterCount), line.charAt(characterCount) == '*');
    

    【讨论】:

    • 那么这是否意味着存储在 HashMap 中的每个字符都有自己的唯一键?但问题是,程序如何知道坐标是否已经通过?就像计算到达目的地的所有可能路径一样。
    • 我实际上并没有假设直接对 HashMap 进行操作。它旨在使其简单并接受您指定的稀疏地图。您可以尝试使用类似的图结构进行遍历。您必须进行深度优先遍历。
    【解决方案3】:

    我假设您面临的唯一问题是决定如何正确读取文件以进行处理或应用算法来确定给定迷宫中唯一路径的数量。

        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;
            }
    

    有了这个,您现在可以专注于实际遍历矩阵以确定从右上角到左下角的唯一路径的数量的算法。 话虽如此,一旦你有了上面的矩阵,你就不仅限于从右上角遍历到左下角,而是迷宫中的任何任意点都可以作为起点和终点。

    如果您在计算唯一路径的数量方面需要帮助,我可以编辑以包含该位,但动态编程应该有助于获得相同的路径。

    【讨论】:

    • 能否请您包括该位以计算从起点到终点的唯一路径的数量?另外我从上面评论说 01 可以改变位置,即 0 可以在 [2] 或 [3] 索引上.我实际上想看看你是如何使用 DP 而不是 Recursion 的(我在想什么)。干杯!
    • 从起点到终点的唯一路径的数量是无限的。你可以走任意多圈,直到你决定真正去目标。
    • 我不认为它是无限的,唯一允许你移动的是右下角到达目的地。即使起点 0 在第 3 列,也只能向右或向下移动,不能向左移动。
    • 哦,我错过了你问题中的那句话。等等,它只询问是否将该文件放入数据结构中。
    • 那是我的错,我现在已经编辑了我的问题。
    【解决方案4】:
    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
            }
        }
    }
    

    现在,一些假设:我假设第一行包含迷宫大小的声明,因此它将用于初始化二维数组。另一个假设是您可以使用 char 数组,但如果您愿意,这很容易更改。

    您可以从这里开始研究您的寻路算法。

    顺便说一句,你尝试实现的这个东西让我想起了 Adventofcode 挑战系列中的很多 this challenge。有很多人在讨论他们对挑战的解决方案,看看in Reddit for instance,你会发现很多关于如何继续你的小实验的小窍门。

    玩得开心!

    【讨论】:

    • 我其实很喜欢这个答案,读取文本文件并放入二维字符数组。但是,我现在在获取从 01 的所有可能路径时遇到了一些麻烦。是的,我可以轻松地从 0 到 1,但我想不出一种算法可以在呆在墙内的同时获得所有可能的路径。
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2012-11-26
    相关资源
    最近更新 更多