c# – 如何通过A *寻路避免偷工减料?

在我第二次尝试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在上面的评论中提到的那样,您可以生成一个包含八个可能的邻居的列表,并检查它们是否有效.这里有效不仅意味着要检查它们是否被阻挡,您还应该在这里检查切角.

点赞