示例#1
0
        public static IEnumerable <string> GetAllDestinationsByEpsilons(NondeterminedFiniteAutomaton epsilonNfa, string startState)
        {
            Queue <int> front = new Queue <int>();

            int[] number = new int[epsilonNfa.NumberOfStates];
            int[] father = new int[epsilonNfa.NumberOfStates];
            for (int i = 0; i < number.Length; i++)
            {
                number[i] = 0;
                father[i] = 0;
            }
            int startStateIndex = epsilonNfa.GetStateIndex(startState);

            number[startStateIndex] = 1;
            front.Enqueue(startStateIndex);
            int counterNum = 1;

            while (front.Count != 0)
            {
                int frontHead        = front.Dequeue();
                var destinationsFrom = epsilonNfa.GetTransitionDestinations(frontHead, 0);
                foreach (var state in destinationsFrom)
                {
                    if (number[state] == 0)
                    {
                        front.Enqueue(state);
                        number[state] = ++counterNum;
                        father[state] = frontHead;
                    }
                }
            }
            return(epsilonNfa.GetStates().Where((name) => (number[epsilonNfa.GetStateIndex(name)] > 0)));
        }