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