public BothBell(SingleBell parents, SingleBell child, TypeCompare compare, TypeSorted sorted, TypeAlignCfg align) { this._parents = parents; this._child = child; Compare = compare; Sorted = sorted; Align = align; }
private void ShowAddBell(int position, int amount, SingleBell A) { this.progressBar1.Maximum = amount; this.progressBar1.Value = position; this.label4.Text = String.Format("Найдено {0} вариантов из {1}", position, amount); if (position == amount) { Bell.AddBellElement -= ShowAddBell; } }
void Gen(ref List <SingleBell> E, SingleBell A, int k, int p) // Рукурсивная процедура генерации перестановок { // Входные данные: // A - Входной масссив последовательности // k - текущее значение длины сформированной последовательности if (A.Count > 0) { if (k == A.Count) // Если сформировалась последовательность длиной, которая соответствует { // начальной длине массива последовательности, то добавляем ее в итоговый массив if (!SearchBell(E, A)) { lock (this) { E.Add(A.Clone()); if (AddBellFullElement != null) { AddBellFullElement(countOfAddBellFullElementEvent++, amountBellFull.Count, new BothBell(aBell[p], E[E.Count - 1]), p); // Вызов события AddBellFullElement нахождения очередного элемента массива конфигураций обобщенных чисел Белла } } } } else // Если длина последовательности не достигла длине // перевоначального массива, { // производим циклические перестановки SingleBell R = A.Clone(); // Создаем временный массив for (int i = k; i < A.Count; i++) { for (int j = 0; j < R.Count; j++) { if (j == k) { R[j] = A[i]; } else if (j == (i)) { R[j] = A[k]; } else { R[j] = A[j]; } } if (stopThread()) { i = A.Count; } else { Gen(ref E, R, k + 1, p); } } R = null; } } }
public Bell(int count) { aBell = new List <SingleBell>(); aBellFull = new List <BothBell>(); aBellTemp = new SingleBell(); T = new Thread[0]; S = new bool[0]; amountBell = new A000041(count); amountBellFull = new A005418(count); countOfAddBellFullElementEvent = 0; LengthChild = count; LengthParents = count; Count = count; }
/// <summary> /// Метод, производящий перестановку элементов массива /// </summary> /// <param name="R"></param> /// <param name="k"></param> /*void Mix(ref tempArr[] R, uint k) // Метод, производящий перестановку элементов массива * { * if (k < (R.Length - 1)) * { * int a = R[k][R[k].I]; * int b = R[k][k]; * for (int j = 0; j < R.Length; j++) * { * if (j == k) R[k + 1][j] = a; * else if (j == R[k].I) R[k + 1][j] = b; * else R[k + 1][j] = R[k][j]; * } * } * }*/ bool SearchBell(List <SingleBell> T, SingleBell a) // Метод, который проверяет на наличие дубликата { // T - Массив, в котором ведется поиск, // a - массив искомой конфигурации // Возвращает true, если такая конфигурация уже существкует bool r = false; bool k; if (T.Count > 0) { for (int i = 0; i < T.Count; i++) { k = true; for (int j = 0; j < T[i].Count; j++) { if (T[i][j] != a[j]) { k = false; j = T[i].Count; } } r = k; if (k) { i = T.Count; } } if (!r) { for (int i = 0; i < T.Count; i++) { k = true; for (int j = 0; j < T[i].Count; j++) { if (T[i][T[i].Count - j - 1] != a[j]) { k = false; j = T[i].Count; } } r = k; if (k) { i = T.Count; } } } } return(r); }
/*void PermutationBell() // Метод для полных перестановок полученных конфигураций в массиве aBell[] * { // Результат заносится в массив aBellFull[] * * aBellFull.Add(new BothBell(aBell[0], aBell[0])); * lock (this) * { * if (AddBellFullElement != null) AddBellFullElement(countOfAddBellFullElementEvent++, amountBellFull.Count, aBell[0], 0, aBell[0]); // Вызов события AddBellFullElement нахождения очередного элемента массива конфигураций обобщенных чисел Белла * } * T = new Thread[aBell.Count - 1]; * S = new bool[aBell.Count - 1]; * for (int i = 0; i < S.Length; i++) S[i] = false; * for (int i = 1; i < aBell.Count; i++) * { * T[i - 1] = new Thread(new ParameterizedThreadStart(Generate)); * T[i - 1].IsBackground = true; * T[i - 1].Start((object)i); * //Generate((object)i); * } * TimeBellFull = DateTime.Now - timeStartBellFull; * }*/ void Generate(object o) { int i = (int)o; SingleBell A = aBell[i].Clone(); List <SingleBell> E = new List <SingleBell>(); Gen(ref E, A, 0, i); if (E.Count != 0) { lock (this) { for (int j = 0; j < E.Count; j++) { aBellFull.Add(new BothBell(aBell[i], E[j])); } S[i - 1] = true; } } }
public VariantRullerBuilder(SingleBell configs) : this(configs.ToArrayBell()) { }
public BothBell(SingleBell parents, SingleBell child) : this(parents, child, TypeCompare.FirstParents, TypeSorted.Up, TypeAlignCfg.Left) { }