Рекурсия: решение импортированного лабиринта?

Я работаю над лабиринтом и застрял. Используя 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: (Первое число устанавливает значение массива [col] [], второе устанавливает значение массива [][row] для размера.)

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

person HowbeitGirl    schedule 16.10.2014    source источник
comment
Я предлагаю просмотреть хиты для алгоритм решения лабиринта. Первые два выглядят многообещающе.   -  person Code-Apprentice    schedule 16.10.2014
comment
У вас есть образец файла? Первое, что нужно сделать, это определить начальную точку, затем вы можете использовать правило левой руки, по сути, всегда следовать вдоль стены слева от вас. Вам понадобится метод, который может принимать направление и определять, может ли он двигаться или нет, если он не может, он поворачивается на 90 градусов и вызывает себя с новым направлением...   -  person MadProgrammer    schedule 16.10.2014
comment
Я должен использовать лабиринты как есть, мой профессор не сделал начальную точку, поэтому я не могу ничего добавить, чтобы создать начальную и конечную точки. Я просто предполагаю, что мы начнем с одного из верхних углов, когда освободится место. Я не думаю, что нам нужно пройти весь лабиринт, и нам не нужно, чтобы он был кратчайшим путем, его просто нужно решить. Code-Apprentice, я щелкнул ссылку, и результат Википедии помог мне получить довольно приличная хватка. Я признаю, что немного отстаю от этого задания из-за неспособности читать, так что мои навыки не такие сложные, как у других.   -  person HowbeitGirl    schedule 16.10.2014
comment
Я могу делать не так много за раз, поэтому я ДЕЙСТВИТЕЛЬНО не слишком хорошо понимаю сложный код. Я надеюсь на более простое объяснение.   -  person HowbeitGirl    schedule 16.10.2014
comment
@MadProgrammer, мне было интересно, существует ли что-то подобное! Как бы вы предложили эту процедуру?   -  person HowbeitGirl    schedule 16.10.2014
comment
Это глупо... но как добавить в массив? массив [строка] [столбец]. добавить (столбец); не работает. Он жалуется, что метод add(int) не определен для типа Array. Что я делаю неправильно?   -  person HowbeitGirl    schedule 18.10.2014


Ответы (2)


Во-первых, я не думаю, что Array[][] является правильным типом данных для использования в 2D-массиве символов. Возможно, вместо этого вы могли бы использовать char[][], так как каждый элемент будет либо ' ', либо '#'.

Во-вторых, вы можете начать с точки «входа» в лабиринт и изменить ' ' на '.', чтобы указать «Я могу добраться сюда»; затем измените каждый ' ' на '.', если он находится рядом с '.'.

Вспеньте, смойте и повторяйте, пока вы ЛИБО не достигнете конечной точки, ИЛИ не закончатся символы, чтобы перейти на '.' (в этом случае лабиринт невозможен).

person Dawood ibn Kareem    schedule 16.10.2014
comment
Идея хлебной крошки (изменение PATH на TRIED. — хорошая идея. Это также поможет с отслеживанием. Но что насчет случаев, когда он находится на пересечении с 2+ возможными путями? Я обязательно изменю этот char[][] , спасибо! :) Дэвид Уоллес - person HowbeitGirl; 16.10.2014
comment
На перекрестке нормально. Помните, вы отмечаете все рядом с точкой другой точкой. Поэтому, если есть пересечение, ваша линия точек распространяется во всех возможных направлениях. Обратите внимание, что этот метод не решает лабиринт за вас — он только говорит вам, что решение есть; что вы спросили. - person Dawood ibn Kareem; 16.10.2014
comment
Ааа! Я понял теперь! Я поговорил со своим профессором дальше, и он сказал то же самое, что и вы. Я был сбит с толку тем, как вернуться в лабиринт. Он объяснил, что под образцом лабиринта, который он предоставил, есть ряд чисел, первые 2 — это координаты для массива[строка][], а вторые — для массива[][столбец], сообщающие мне начальную и конечную точки. Пересечения меня смутили, ваш метод правильный, но отслеживать пересечения (какие пути я выбрал), сохраняя пересечения в массив и выталкивая их, когда они не нужны. Спасибо Давид!!! - person HowbeitGirl; 17.10.2014
comment
Хорошо .... Я только что понял, что это не добавляется в массив. Как сохранить то, что читается в массиве? - person HowbeitGirl; 18.10.2014
comment
Я попытался обменять его во второй раз с помощью ArrayList, и на этот раз он не жалуется, а выдает ошибку ArrayIndexOutOfBounds при запуске. Я разберусь с этой частью... Спасибо всем! - person HowbeitGirl; 18.10.2014
comment
Хорошо, @HowbeitGirl, удачи, и не стесняйтесь комментировать снова, если вам нужна дополнительная помощь. Извините, что я не был онлайн в течение последних нескольких дней, чтобы увидеть ваши предыдущие комментарии здесь. - person Dawood ibn Kareem; 19.10.2014
comment
Ты молодец, Дэвид Уоллес, ты мне очень помог! Обмен его на массив char[][] сделал его функциональным... теперь нам просто нужно загрузить то, что читается в массив. - person HowbeitGirl; 20.10.2014
comment
Спасибо за помощь ранее! :) - person HowbeitGirl; 20.10.2014
comment
Нет проблем @HowbeitGirl - рад, что у вас все заработало. - person Dawood ibn Kareem; 20.10.2014

Эта задача легко трансформируется в задачу обхода графа. Представьте себе каждую точку «пути» лабиринта как вершину графа и добавьте ребро между двумя вершинами тогда и только тогда, когда они непосредственно соседствуют в лабиринте. После этого вы можете использовать алгоритмы BFS или DFS, чтобы найти путь от начальной вершины лабиринта к конечной вершине. Если при использовании BFS вам даже не нужно явно строить график, подойдет двумерный массив лабиринта. Для каждой вершины вы можете пройти в 4 направлениях, проверить, не находится ли она за пределами границ и доступна ли она (является пробелом), проверить, посещали ли вы ее уже, и если нет, добавить ее в очередь.

Надеюсь, это даст вам достаточно указаний для дальнейших исследований.

person Andrew Lutsenko    schedule 16.10.2014