Это не поиск в ширину - сначала глубина.
Есть 2 места, которые, очевидно, сначала глубины
- вы удаляете с конца границы (возможных тайлов), а не с начала.
- у вас нет иерархии обхода (от родительского к дочернему) для перестройки пути обхода, только один «путь» с плитками. Следовательно, сначала глубина.
Что нужно изменить:
- вместо LinkedList, измените его на словарь. Ключом словаря будет плитка, а значением будет родительский элемент плитки. Используйте это, чтобы восстановить ваш последний путь.
- Ваша функция "moveNext", вероятно, правильная. Убедитесь, что он выдвигается до конца списка.
- не извлекайте (getLast ()) из возможных шагов. Возможные шаги должны быть в порядке очереди. Извлеките первую плитку возможных шагов (сначала будут исследованы плитки, ближайшие к началу).
Что нужно улучшить:
- вместо использования плитки для отслеживания исследований, используйте набор (назовите его ExploredTile), куда вы кладете плитки, которые вы прошли)
- использовать очередь вместо списка.
Некоторый C # / псевдокод (потому что я не в IDE)
Dictionary<Tile,Tile> path = ...;
Queue<Tile> frontier = ...;
Set<Tile> explored = ...;
path[start] = null;
while(frontier.Count > 0){
var tile = frontier.Dequeue();
if(explored.Contains(tile)){
continue;
}
explored.add(tile);
if (Tile == Exit){
rebuildPath(Exit);
}else{
for (Tile t in Tile.neighbours){
if (!explored.Contains(t)){
frontier.Enqueue(t);
path[t] = tile; // Set the path hierarchy
}
}
}
}
RebuildPath
LinkedList<Tile> finalPath = ...;
Tile parent = path[exitTile];
finalPath.push(exitTile);
while(parent != null){
finalPath.push(parent);
parent = path[parent];
}
finalPath.reverse();
Надеюсь, я правильно понял ... :)