Пример #1
0
        public static StatesSequence GetStatesSequence(string startState, List <int> summators, string mode, int number) // получаем последовательность состояний
        {
            StatesSequence statesSequence = new StatesSequence();

            statesSequence.name = String.Format("Последовательность {0}", number);
            statesSequence.InitilizeSequencesBySummator(summators.Count);
            statesSequence.summators.AddRange(summators);

            List <string> states       = new List <string>();
            string        currentState = startState;
            string        stateIsExist = null;

            while (stateIsExist == null)
            {
                states.Add(currentState);

                foreach (var summator in summators)
                {
                    statesSequence.sequences[summators.IndexOf(summator)].Append(GetStateBySummator(currentState, summator));
                }

                usedStatesCount++;
                currentState = GetNextState(currentState, summators, mode);
                stateIsExist = states.FirstOrDefault(state => state.Equals(currentState));
            }

            statesSequence.states.AddRange(states);
            return(statesSequence);
        }
Пример #2
0
        public static List <StatesSequence> Generate(string finalPolinom, string mode)
        {
            List <StatesSequence> sequences  = new List <StatesSequence>();
            List <int>            summators  = GetSummatorsFromPolinom(finalPolinom);
            List <string>         allStates  = GetAllStates(GetMask(finalPolinom.Length - 1));
            List <string>         usedStates = new List <string>();

            allStatesCount = (ulong)allStates.Count;

            string startState = GetMaskedSequence("0", GetMask(finalPolinom.Length - 1), 0);
            int    i          = 1;

            while (startState != null)  // пока есть состояния, которые не были выведены ни в одной из последовательностей
            {
                StatesSequence currentSequence = new StatesSequence();
                currentSequence = GetStatesSequence(startState, summators, mode, i);

                if (currentSequence.states.Count > 1)
                {
                    sequences.Add(currentSequence);
                    currentSequence.PrintSequence();
                    i++;  // считаем последовательности состояний
                }
                else
                {
                    forbiddenStates.AddRange(currentSequence.states);
                }

                usedStates.AddRange(currentSequence.states);      // помечаем использованные состояния
                usedStates = usedStates.OrderBy(q => q).ToList(); // упорядочиваем их

                foreach (var state in usedStates)
                {
                    allStates.RemoveAll(x => x.Equals(state)); // из списка всех состояний удаляем использованные
                }
                startState = allStates.FirstOrDefault();       // получаем первое состояние в оставшихся неиспользованных
            }

            return(sequences);
        }