Я пытаюсь решить лабиринт с помощью scala, используя поиск с возвратом.
Моя проблема в том, что я продолжаю получать ошибки StackOverflow.
Я пробовал довольно много вещей, но всегда получаю StackOverflow.
findStart() и getWay() показывают два подхода, которые я использовал.
Я знаю, что это можно сделать с помощью Streams и вычислить все возможные способы за одну рекурсию, но я хотел бы сначала решить это с помощью возврата.
Вот мой код:
object MazeSolver {
case class Cell(free: Boolean, start: Boolean)
type Maze = Seq[Seq[Cell]]
def main(args: Array[String]) = {
val lab = lislab("laby1.rinth")
val entrance = findStart(lab, Position(0, 0))
println(getWay(lab, entrance(0), entrance(0), Nil))
}
def findStart(lab: Maze, pos: Position): List[Position] = {
try {
if (lab(pos.column)(pos.row).start)
List(pos)
else
findStart(lab, pos.south) ::: findStart(lab, pos.north) ::: findStart(lab, pos.west) ::: findStart(lab, pos.east)
} catch {
case _: java.lang.IndexOutOfBoundsException => Nil
}
}
def getWay(maze: Maze, pos: Position, lastPos: Position, way: List[Position]): List[Position] = {
try {
if (!maze(pos.column)(pos.row).free && !maze(pos.column)(pos.row).start) {
Nil
} else {
if (isExit(pos, maze)) {
pos :: way
} else {
val posList = List(pos.north, pos.south, pos.west, pos.east)
posList.foreach { x =>
val tail = getWay(maze, x, pos, way)
if(tail != Nil) tail :: way
}
Nil
}
}
} catch { case _: java.lang.IndexOutOfBoundsException => way }
}
def lislab(fn: String): Maze = {
try {
(for (column <- io.Source.fromFile(fn, "UTF-8").getLines.toList)
yield for (c <- column) yield Cell(c == ' ', c == '?')).toIndexedSeq
} catch { case _: java.io.FileNotFoundException => Nil }
}
case class Position(column: Int, row: Int) {
override def toString = "(" + column + "." + row + ")"
def north = Position(column - 1, row)
def south = Position(column + 1, row)
def west = Position(column, row - 1)
def east = Position(column, row + 1)
}
def isExit(pos: Position, lab: Maze): Boolean = {
val cell = lab(pos.column)(pos.row)
cell.free && (pos.column == 0
|| pos.column == lab.length - 1
|| pos.row == 0
|| pos.row == lab(0).length - 1)
}
}
Что я делаю неправильно? Как заставить функции findStart() и getWay() работать правильно?