我正在尝试使用BFS算法创建一个程序,所以我将每个节点都放在一个队列中,并且每个级别都在队列中我开始将它与另一个节点进行比较以查看它们是否相等,但问题是我的问题是我的队列中的元素正在被修改,因此当我执行Dequeue时,我从来没有得到答案,而且我得到了堆栈溢出。
我不确定我的代码中有哪些部分出现问题,因为堆栈溢出发生在整个地方,但我会发布一部分队列和Dequeuing。
所以是的,基本上在第二个循环之后它开始弄乱一切,它为我的矩阵增加了超过1“b”并且它修改了我的Queue元素。
private void BFS(Nodo<string[,]> nodo)
{
Array.Copy(nodo.getEA(), datos5, 9);
temp = null;
temp2 = null;
temp3 = null;
temp4 = null;
Array.Copy(datos5, datos, 9);
//There are a bunch of if and else if so I just posted one
if (datos[1, 0].Equals("b"))
{
Array.Copy(datos, datos2, 9);
Array.Copy(datos, datos3, 9);
cont3=3;
//UP from 1,0 a 0,0
datos[1, 0] = datos[0, 0];
datos[0, 0] = "b";
temp = new Nodo<string[,]>(datos);
temp.setCamino("U");
temp.setPadre(nodo);
myq.Enqueue(temp);
temp = null;
//Right from 1,0 a 1,1
datos2[1, 0] = datos2[1, 1];
datos2[1, 1] = "b";
temp2 = new Nodo<string[,]>(datos2);
temp2.setCamino("R");
temp2.setPadre(nodo);
myq.Enqueue(temp2);
temp = null;
//Down from 1,0 a 2,0
datos3[1, 0] = datos3[2, 0];
datos3[2, 0] = "b";
temp3 = new Nodo<string[,]>(datos3);
temp3.setCamino("D");
temp3.setPadre(nodo);
myq.Enqueue(temp3);
fila();
}
}
private void fila()
{
Nodo<string[,]> temp5;
for (int i = 0; i < myq.Count; i++)
{
temp5 = null;
temp5 = (Nodo<string[,]>)myq.Dequeue();
if (objetivo(temp5, nodof))
{
if (!flag2)
{
boxResultado.AppendText("Problem solved");
flag2 = true;
break;
}
else
{
break;
}
}
else
{
if (!flag2)
{
BFS(temp5);
}
else
{
break;
}
}
}
}
private bool objetivo(Nodo<string[,]> p, Nodo<string[,]> e)
{
nodo1 = null;
nodo2 = null;
bool flag = false;
nodo1 = p.getEA();
nodo2 = e.getEA();
for (int i = 0; i < 3; i++)
{
for (int f = 0; f < 3; f++)
{
if (nodo1[i, f] != nodo2[i, f])
{
flag = true;
}
}
}
if (flag)
{
return false;
}
else
{
return true;
}
}
我知道我的代码非常可怕,但我一直在努力找出过去5个小时左右的问题,所以我一直在修改这里并尝试找到问题,但我感到非常沮丧所以我决定在这里寻求帮助。 顺便说一句,这是在C#
提前致谢
答案 0 :(得分:0)
首先,你没有说明Nodo类的作用。无论如何,BFS非常简单。我告诉你一般的算法。假设您在图中有一个NxN邻接矩阵,您将拥有一个N大小的数组,其中包含所访问节点的标记。初始代码是
class Graph{
//matrix[i,j] is true if there is a node from i to j
bool[,] matrix;
private void BFS( int startNode )
{
int n = matrix.GetLength(0);
bool [] marks = new bool[n];
Queue<int> nodes = new Queue();
nodes.Enqueue(startNode);
while ( !nodes.Empty() )
{
int node = nodes.Dequeue();
//set visited
marks[node] = true;
List<int> adjs = GetAdyacents(node);
foreach ( int adjacent in adjs ){
if ( !mark[adjacent] )
nodes.Enqueue(adjacent);
}
Console.WriteLine("Visiting {0}", node);
}
}
}
GetAdjacent()方法取决于您是否使用矩阵或邻接列表的表示。无论如何很简单,如果你需要知道怎么做,请给我一个消息。
我没有测试过代码,但我非常确定它有效(请原谅任何语法问题!)
希望我能提供帮助 祝你好运! DVD光盘
答案 1 :(得分:0)
我没有深入研究您的代码,但我想知道您是否会因使用Queue而受益。