Beispiel #1
0
        public void WalkWide(int n, ReDrawDelegate reDrawMethod) //обход в ширину
        {
            if (n < 0 || n >= Count())
            {
                throw new ApplicationException("Start vertex index is out of range");
            }

            ResetVisit();
            ResetInTree();
            Queue <int> queue = new Queue <int>(); //создаем очередь и кладем в нее начальную вершину

            queue.Enqueue(n);
            vList[n].Visit = true;                                //делаем ее посещенной
            UpdateWithSleep(reDrawMethod);
            while (queue.Count > 0)                               //пока очередь не пуста
            {
                n = queue.Dequeue();                              //забираем первый элемент очереди и его номер записываем в n
                UpdateWithSleep(reDrawMethod);
                for (int i = 0; i < vList[n].Edges.Count; i++)    //перебираем все ребра этого элемента
                {
                    int m = NumNode(vList[n], vList[n].Edges[i]); //в m записываем номер вершину, в которую ведёт данное ребро
                    if (!vList[m].Visit)                          //если вершина m не посещена
                    {
                        queue.Enqueue(m);                         //кладём её в очередь
                        vList[m].Visit = true;                    //делаем ее посещенной
                        UpdateWithSleep(reDrawMethod);
                    }
                }
            }
            UpdateWithSleep(reDrawMethod);
        }
Beispiel #2
0
        public void WalkDeep(int n, ReDrawDelegate reDrawMethod) //обход в  глубину
        {
            if (n < 0 || n >= Count())
            {
                throw new ApplicationException("Start vertex index is out of range");
            }

            ResetVisit();
            ResetInTree();
            Stack <int> stack = new Stack <int>();

            stack.Push(n);          //Создается стек и кладется начальная вершина
            vList[n].Visit = true;  //Начальная вершина делается посещенной
            UpdateWithSleep(reDrawMethod);
            while (stack.Count > 0) //пока стек не пуст
            {
                n = stack.First();  //смотрим вершину в начале стека и записываем ее номер в n
                int i = 0;
                int m = -1;
                while (i < vList[n].Edges.Count())            //перебираем все рёбра вершины n
                {
                    m = NumNode(vList[n], vList[n].Edges[i]); //в m записываем номер вершину, в которую ведёт данное ребро
                    if (!vList[m].Visit)                      //если m не посещена
                    {
                        stack.Push(m);                        //кладём m в стек
                        vList[m].Visit = true;                //и делаем ее посещенной
                        UpdateWithSleep(reDrawMethod);
                        break;
                    }
                    i++;
                }
                if (i == vList[n].Edges.Count()) //если не оказалось непосещенных соседей вершины n
                {
                    stack.Pop();                 //забираем верхний элемент стека (там вершина n)
                    UpdateWithSleep(reDrawMethod);
                }
            }
            UpdateWithSleep(reDrawMethod);
        }
Beispiel #3
0
 private void UpdateWithSleep(ReDrawDelegate reDrawMethod) //перерисовка экрана с задержкой через делегат
 {
     Thread.Sleep(500);                                    //задержка
     reDrawMethod?.Invoke();                               //вызов перерисовки
 }