Проблема с очередью - PullRequest
       6

Проблема с очередью

0 голосов
/ 27 сентября 2010

Я пытаюсь создать программу, использующую алгоритм 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 #

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Я не глубоко изучил ваш код, но мне интересно, выиграете ли вы от использования Очереди .

0 голосов
/ 27 сентября 2010

Прежде всего, вы не указали, что делает класс 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...