Как бы я кодировать метод, который находит путь лабиринта / сетки? Что я буду делать после? - PullRequest
0 голосов
/ 08 апреля 2020

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

Так что для этой реализации мне разрешено использовать только BFS. Моим первым шагом было бы преобразовать лабиринт в график, но я не уверен, с чего начать. Тогда мне придется запустить BFS на плитке, содержащей бегун лабиринт. Наконец, я должен был бы отойти от тайла цели, чтобы построить путь. У меня так много шагов, что мне действительно нужна помощь в обработке этого.

class GridLocation(val x: Int, val y: Int){

  override def toString = s"($x, $y)"

  override def equals(that: Any): Boolean = {
    that match {
      case other: GridLocation =>
        this.x == other.x && this.y == other.y
      case _ => false
    }
  }
}


object MapTile {

  def generateRow(row: String): List[MapTile] = {
    row.map((ch: Char) => MapTile(ch.toString)).toList
  }

  def apply(tileType: String): MapTile = {
    tileType match {
      case "-" => new MapTile("ground", true)
      case "G" => new MapTile("goal", true)
      case "O" => new MapTile("wall", false)
    }
  }

}

class MapTile(val tileType: String, val passable: Boolean) {

}


def findPath(start: GridLocation, end: GridLocation, map: List[List[MapTile]]): List[GridLocation] = {
  //code starts here
}

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вместо того, чтобы явно строить график, вы можете просто сохранить график неявно, пытаясь в каждой ячейке двигаться в каждом из четырех основных направлений [y+1,x],[y-1,x],[y,x+1],[y,x-1] и добавлять новую ячейку в очередь только в том случае, если она удовлетворяет следующему :

  1. Новая ячейка находится в сетке и не является стенным блоком.
  2. Новая ячейка ранее не посещалась.

Чтобы отслеживать посещенные ячейки, вы можете использовать вспомогательный массив размером с сетку и пометить посещенные ячейки как 1, а не посещенные - как 0. Кроме того, чтобы сохранить путь, вы можете сохранить еще один вспомогательный массив, который хранит для каждой ячейки «родительскую ячейку», которая привела непосредственно к этой ячейке, и по окончании BFS вы можете возвращать родителей, начиная с конечной ячейки и обратно в начальную ячейку.

Для ясности "родительская ячейка" ячейки x - это ячейка, которая рассматривалась при добавлении x в очередь.

0 голосов
/ 09 апреля 2020

Я рекомендую вам взглянуть на алгоритм A * или другой алгоритм поиска пути. Я думаю, что канал Youtube «Поезд кодирования» сделал видео об этом.

Добрый день.

...