在我第二次尝试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表示对角线单元.
我认为这是阻止我完成算法的最后一件事,所以我期待任何帮助或建设性的输入.
提前致谢!
最佳答案 正如Eric在上面的评论中提到的那样,您可以生成一个包含八个可能的邻居的列表,并检查它们是否有效.这里有效不仅意味着要检查它们是否被阻挡,您还应该在这里检查切角.