【问题标题】:Recursion: Solving an imported maze?递归:解决进口迷宫?
【发布时间】:2014-12-11 05:12:21
【问题描述】:

我正在迷宫中工作,但被卡住了。使用 JFileChooser,我可以在 .txt 文件中导入并读入迷宫,其中一系列空格和主题标签确定路径和墙壁。 String path = " ";String wall = "#";

这是目前做所有事情的方法:

@Override
    public void readMaze() throws FileNotFoundException
    {
        int row;
        int col;

        JFileChooser chooser = new JFileChooser();
        Scanner in = null;

        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
        {
        File selectedFile = chooser.getSelectedFile();
        in = new Scanner(selectedFile);

        /*READ FILE*/
        Scanner readLine = new Scanner (new FileReader(selectedFile));

        col = readLine.nextInt();//first reading
            System.out.println(col);
        row = readLine.nextInt(); //second reading
            System.out.println(row);

        Array[][] array = new Array[row][col];

        do
        {
            String i = readLine.nextLine();

            //System.out.println(i);

            for (int j = 0; j < i.length(); j++)
            {
                String compare = i.substring(j, j+1);

                if(compare.equals(wall))
                {
                    //Do nothing, see if there's a path adjacent.
                    System.out.println("Wall");
                }
                if(compare.equals(path))
                {
                    System.out.println("Path");
                    //Check for additional paths.
                        // don't if explored
                        //else explore
                }
            }

        } while(readLine.hasNextLine() == true);

        readLine.close();

        }

    }

这是我们现在的界面,如果重要的话: 公共接口lab3MVCInterface

{
    enum direction {N, S, E, W};

    void readMaze() throws FileNotFoundException;
    void solveMaze();

    JFileChooser chooser = new JFileChooser();
    Scanner in = null;

    String wall = "#";
    String path = " ";
    void readMaze(JFileChooser chooser, Scanner in)
            throws FileNotFoundException;


}

但是我们不知道如何确定如何确定是否存在路径。这是一个课堂作业,所以我不是在寻找答案,但我希望能以正确的方法指出正确的方向。对于分配,我们可以使用递归或堆栈来完成它......我们决定使用递归,因为堆栈对我们来说是一场噩梦。

感谢您的帮助!! :) 我知道过去我没有跟进线程,但我正在努力更新它们(在丢失我的帐户密码后,我将自己锁定在电子邮件之外。去看看)我们说话!

编辑:这是从 .txt 文件打开的代码示例: (第一个数字设置 array[col][] 值,第二个设置 array[][row] 值用于调整大小。)

7
7
#######
    ###
### ###
### ###
#      
### ###
#######

【问题讨论】:

  • 我建议查看"maze solving algorithm" 的点击量。前两个看起来很有希望。
  • 您有示例文件吗?首先是确定你的起点,然后你可以使用“左手”规则,基本上,总是沿着你左边的墙走。您将需要一个可以确定方向并确定它是否可以移动的方法,如果不能,它会旋转 90 度并以新方向调用自身...
  • 我必须按原样使用迷宫,我的教授没有设置起点,所以我无法添加任何东西来创建起点和终点。我只是假设当空间第一次可用时,我们从一个顶角开始。我不认为我们必须通过整个迷宫,我们不必将它作为“最短路线”,它只需要解决。Code-Apprentice,我点击了链接,维基百科的结果帮助我得到相当不错的把握。我承认由于阅读障碍,我在这项任务上有些落后,所以我的技能不如其他人那么成熟。
  • 我一次只能做这么多,这就是为什么我真的不太了解复杂的代码。我希望有一个更简单的解释。
  • @MadProgrammer,我想知道是否存在类似的东西!你会如何建议这个程序?

标签: java arrays recursion stack maze


【解决方案1】:

首先,我认为Array[][] 不是用于二维字符数组的正确数据类型。也许您可以改用char[][],因为每个元素都是' ''#'

其次,你可以从迷宫的“入口”点开始,将' '改为'.',表示“我可以到这里”;然后将每个' ' 更改为'.',如果它与'.' 相邻。

起泡、冲洗并重复,直到您到达终点,或者用完字符以更改为 '.'(在这种情况下,迷宫是不可能的)。

【讨论】:

  • 面包屑的想法(将路径“”更改为 TRIED“。”是一个好主意。它也有助于跟踪。但是如果它与 2 条以上的可能路径相交会怎样呢?我一定会改变那个 char[][],谢谢!:) David Wallace
  • 十字路口没问题。请记住,您用另一个点标记一个点旁边的所有内容。所以如果有一个交叉点,你的点线就会在每个可能的方向上展开。请注意,此方法不会为您解决迷宫 - 它只会告诉您有解决方案;这是你问的。
  • 啊!我现在明白了!我和我的教授进一步交谈,他说的和你一模一样。我对如何在迷宫中回溯感到困惑。他解释说他提供的示例迷宫下面有一系列数字,前两个是array[row][]的坐标,第二个是array[][col]的坐标,告诉我起点和终点。交叉点让我很困惑,他的方法是正确的,但是通过将交叉点存储到数组中并在不需要它们时弹出它们来跟踪交叉点(我采取的路径)。谢谢大卫!!!
  • 好吧....我刚刚意识到这并没有添加到数组中。如何将正在读取的内容存储到数组中?
  • 我第二次尝试使用 ArrayList 进行交易,这次它没有抱怨,但在运行时会抛出 ArrayIndexOutOfBounds 错误。我会弄清楚这部分......谢谢大家!
【解决方案2】:

这个问题很容易转化为图遍历问题。将迷宫的每个“路径”点想象为图形的一个顶点,当且仅当它们在迷宫中直接相邻时,才在两个顶点之间添加一条边。之后,您可以使用 BFS 或 DFS 算法来查找是否存在从迷宫的起始顶点到结束顶点的路径。 如果使用 BFS,您甚至不必显式构建图形,迷宫的 2D 数组就可以了。对于每个顶点,您可以朝 4 个方向前进,检查它是否超出边界并且可访问(是空格字符),检查您是否已经访问过它,如果没有将其添加到队列中。

希望这能为您提供足够的指导以进行进一步的研究。

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多