#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. У меня это работает. Вторая часть — поиск кратчайшего пути. Можете ли вы порекомендовать мне простой алгоритм, который я могу реализовать?