C# 非加权有向图上的BFS。如何返回a和B之间的路径列表

C# 非加权有向图上的BFS。如何返回a和B之间的路径列表,c#,graph,C#,Graph,我有一个用图形表示的网格。每个“节点”称为单元 我希望在输出中有一个从a到B的路径。我在控制台上写下了输出,我发现它是错误的。特别是,它似乎产生了一条“跳跃”很多的路径,这意味着从一个节点到下一个节点没有直接链接 如果工作,我只需要从a到B的路径,而不是到达每个节点的路径 我的代码怎么了 Cell是一个对象,它包含一个靠近cells的列表,其中引用了所有径向单元格 private List<Cell> FindPath(Cell A, Cell B) {

我有一个用图形表示的网格。每个“节点”称为单元

我希望在输出中有一个从a到B的路径。我在控制台上写下了输出,我发现它是错误的。特别是,它似乎产生了一条“跳跃”很多的路径,这意味着从一个节点到下一个节点没有直接链接

如果工作,我只需要从a到B的路径,而不是到达每个节点的路径

我的代码怎么了

Cell是一个对象,它包含一个靠近cells的
列表
,其中引用了所有径向单元格

    private List<Cell> FindPath(Cell A, Cell B)
    {
        List<Cell> path = new List<Cell>();
        List<Cell> visited = new List<Cell>();

        path.Add(A);

        while (path.Count != 0)
        {
            Cell c = path[0];
            path.RemoveAt(0);

            visited.Add(c);

            if (c == B)
                return path;

            foreach (Cell near in c.NearCells)
            {
                    if (!visited.Contains(near))
                    {
                        visited.Add(near);
                        path.Add(near);
                    }
            }

        }

        return path;
    }
private List FindPath(单元格A、单元格B)
{
列表路径=新列表();
访问列表=新列表();
路径.添加(A);
while(path.Count!=0)
{
单元c=路径[0];
移除路径(0);
添加(c);
如果(c==B)
返回路径;
foreach(c.NearCells中的Cell near)
{
如果(!visted.Contains(近))
{
已访问。添加(近);
添加路径(近);
}
}
}
返回路径;
}

代码中的path变量将只返回排队但尚未检查的节点,这些节点无论如何都不表示A和B之间的路径。 要实现这一点,您应该创建一个映射来存储每个节点的父节点,当您找到匹配项时,您将在整个映射中运行,直到到达开始节点,同时构建一个列表。但是,此列表将被颠倒,您需要修复它

考虑到这些要点,您应该这样做:

private List<Cell> FindPath(Cell A, Cell B)
{
    var parent = new Dictionary<Cell, Cell>();

    List<Cell> queue = new List<Cell>();
    List<Cell> visited = new List<Cell>();

    queue.Add(A);
    parent.Add(A, null);

    while (queue.Count != 0)
    {
        Cell c = queue[0];
        queue.RemoveAt(0);

        visited.Add(c);

        if (c == B)
            break;

        foreach (Cell near in c.NearCells)
        {                    
            if (!visited.Contains(near))
            {
                parent.Add(near, c);
                visited.Add(near);
                queue.Add(near);
            }
        }
    }

    List<Cell> path = new List<Cell>();

    if(parent.ContainsKey(B))
    {
        Cell backTrack = B;
        do
        {
            path.Add(backTrack);
            backTrack = parent[backTrack];
        }
        while (backTrack != null);
        path.Reverse();
    }
    return path;
}
private List FindPath(单元格A、单元格B)
{
var parent=新字典();
列表队列=新列表();
访问列表=新列表();
加入(A);
parent.Add(A,空);
while(queue.Count!=0)
{
单元c=队列[0];
queue.RemoveAt(0);
添加(c);
如果(c==B)
打破
foreach(c.NearCells中的Cell near)
{                    
如果(!visted.Contains(近))
{
添加(近,c);
已访问。添加(近);
队列。添加(近);
}
}
}
列表路径=新列表();
if(父容器(B))
{
单元回溯=B;
做
{
添加路径(回溯);
回溯=父[回溯];
}
while(回溯!=null);
path.Reverse();
}
返回路径;
}

如何定义
单元格
?这是图的邻接矩阵表示吗?