在我第二次尝试使用A *时,我设法计算了追溯所需的所有值。还用S标记起始细胞,用B阻断起始细胞,用F
标记靶细胞
现在,对于回溯,我只会从目标单元格开始跟随具有最低G值的单元格。
这里我将遵循G = 24 => G = 10 => S上。
正如您所看到的,这个解决方案会创建一个无效的路径,因为在这种情况下它会通过墙。
在计算网格值时,这与角切割一起挂起。正如你在这里看到的那样。人们会回溯:G = 50 => G = 40,接下来将采用G = 20。这导致了切角。
我认为在计算每个相邻单元格的值时会出现此问题。如果我在将相邻单元格添加到当前单元格时设置了一些限制,我可以避免这种情况吗?
public List<Cell> GetAdjacent(Cell _currentCell, List<Cell> _closedList, List<Cell> _gridList)
{
List<Cell> adjacentList = new List<Cell>();
List<Cell> gridList = _gridList;
List<Cell> closedList = _closedList;
Cell currentCell = _currentCell;
foreach (Cell cell in gridList)
{
bool containedInClosedList = closedList.Any(c => c.id == cell.id);
if (!cell.blocked && !containedInClosedList &&
((cell.positionCR.X == currentCell.positionCR.X - 1 && cell.positionCR.Y == currentCell.positionCR.Y) ||
(cell.positionCR.X == currentCell.positionCR.X + 1 && cell.positionCR.Y == currentCell.positionCR.Y) ||
(cell.positionCR.X == currentCell.positionCR.X && cell.positionCR.Y == currentCell.positionCR.Y - 1) ||
(cell.positionCR.X == currentCell.positionCR.X && cell.positionCR.Y == currentCell.positionCR.Y + 1) ||
(cell.positionCR.X == currentCell.positionCR.X - 1 && cell.positionCR.Y == currentCell.positionCR.Y - 1) ||
(cell.positionCR.X == currentCell.positionCR.X - 1 && cell.positionCR.Y == currentCell.positionCR.Y + 1) ||
(cell.positionCR.X == currentCell.positionCR.X + 1 && cell.positionCR.Y == currentCell.positionCR.Y - 1) ||
(cell.positionCR.X == currentCell.positionCR.X + 1 && cell.positionCR.Y == currentCell.positionCR.Y + 1)))
{
adjacentList.Add(cell);
}
}
return adjacentList;
}
我定义的自定义费用是否也存在问题?我对G = 10表示直线,G = 14表示对角线单元。
我认为这是阻止我完成算法的最后一件事,所以我期待任何帮助或建设性的输入。
提前致谢!
答案 0 :(得分:2)
正如Eric在上面的评论中提到的那样,你可以生成一个包含八个可能的邻居的列表,并检查它们是否有效。这里有效不仅意味着检查它们是否被阻挡,您还应该在这里检查切角。