Я пытаюсь создать программу, использующую алгоритм BFS, поэтому я помещаю каждый узел в очередь, и как только каждый уровень находится в очереди, я начинаю сравнивать его с другим узлом, чтобы увидеть, равны они или нет, однако проблема Я имею в виду, что элементы в моей очереди модифицируются, поэтому, когда я делаю очередь, я никогда не получаю ответ и получаю переполнение стека.
Я не уверен, в какой части моего кода возникла проблема, поскольку переполнение стека происходит повсеместно, но я опубликую часть очереди и снятия с очереди.
Так что да, в основном после второго цикла он начинает все портить, он добавляет больше 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 #
Заранее спасибо