Использование стека для решения проблемы объектно-ориентированного (обратного отслеживания) лабиринта

#java #stack #maze

#java #стек #Лабиринт

Вопрос:

Я пытаюсь решить лабиринт объектно-ориентированным способом.

Мой лабиринт состоит из полей, каждое поле имеет атрибут элемента, элемент — это стена, игрок, помощник или конечная точка. Поле с пустым атрибутом — это путь.

Каждое поле отслеживает своих соседей в хэш-карте.

Когда игрок попадает в помощника, помощник должен решить лабиринт и показать правильный путь.

Я пытаюсь найти конечную точку, получая текущее местоположение помощника и сохраняя его соседние поля в стеке.

Это код, насколько это возможно для помощника. Цикл никогда не заканчивается, и я не знаю почему?

 public void findRoute() {

    Collection<Field> c = currentField.getHashMap().values();
    Stack<Field> fieldNeighbours = new Stack<Field>();
    for (Field field : c) {

        fieldNeighbours.push(field);

    }

    while (!endpointReached) {

        Field p = fieldNeighbours.pop();

        if (p.getElement().getNaam().equals("endPoint")) {

            System.out.println("endPoint Reached! ");
            endpointReached = true;
            return;

        }

        if (!p.getElement().getNaam().equals("Wall")) {

            if (!p.getHashMap().get("north").getElement().getNaam().equals("Wall")) {

                fieldNeighbours.push(p.getHashMap().get("north"));


            }
            if (!p.getHashMap().get("south").getElement().getNaam().equals("Wall")) {

                fieldNeighbours.push(p.getHashMap().get("south"));

            }
            if (!p.getHashMap().get("east").getElement().getNaam().equals("Wall")) {

                fieldNeighbours.push(p.getHashMap().get("east"));

            }
            if (!p.getHashMap().get("west").getElement().getNaam().equals("wall")) {

                fieldNeighbours.push(p.getHashMap().get("west"));


            }

        }

    }
  

Комментарии:

1. Вам нужен способ отметить, посещалось ли ранее место или нет. Подумайте о лабиринтах как о действительно длинной древовидной структуре, которая может помочь 🙂

Ответ №1:

В дополнение к стеку вам нужен набор уже посещенных ячеек, чтобы избежать повторных циклов поиска.

Я также укажу, что использование хэшей вместо простых ссылок — плохой дизайн для большинства целей.

Комментарии:

1. Итак, второй стек, который отслеживает посещенные поля?

2. У меня это работает. Вторая часть — поиск кратчайшего пути. Можете ли вы порекомендовать мне простой алгоритм, который я могу реализовать?