Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using System.Collections.Generic;
- namespace CombConsole {
- public class Comb {
- public static IEnumerable<List<T>> SubSetsGeneration<T>(T[] input) {
- var resList = new List<List<T>>();
- int n = input.Length;
- int[] a = new int[n + 1];
- while (a[n] != 1) {
- var list = new List<T>();
- for (int i = 0; i < n; i++)
- if (a[i] == 1)
- list.Add(input[i]);
- resList.Add(list);
- int j = 0;
- while (a[j] == 1) {
- a[j] = 0;
- j++;
- }
- a[j] = 1;
- }
- return resList;
- }
- public static IEnumerable<List<T>> RepetitionPlacing<T>(T[] input, int k) {
- var resList = new List<List<T>>();
- int n = input.Length;
- int[] b = new int[k];
- while (b[k - 1] != n - 1) {
- var list = new List<T>();
- for (int i = 0; i < k; i++)
- list.Add(input[b[i]]);
- resList.Add(list);
- int j = 0;
- while (b[j] == n - 1) {
- b[j] = 0;
- j++;
- }
- b[j]++;
- }
- return resList;
- }
- public static IEnumerable<List<T>> Combinations<T>(T[] input, int k) {
- var resList = new List<List<T>>();
- int n = input.Length;
- int[] b = new int[k];
- for (int i = 0; i < k; i++)
- b[i] = i;
- int ii = 0;
- while (ii != -1) {
- var list = new List<T>();
- for (int i = 0; i < k; i++)
- list.Add(input[b[i]]);
- resList.Add(list);
- int mx = n - 1;
- ii = k - 1;
- for (; ii >= 0; ii--) {
- if (b[ii] < mx) {
- b[ii]++;
- for (int j = ii + 1; j < k; j++)
- b[j] = b[j - 1] + 1;
- break;
- }
- mx = b[ii] - 1;
- }
- }
- return resList;
- }
- public static IEnumerable<List<T>> Permutations<T>(T[] input) {
- var reslist = new List<List<T>>();
- int n = input.Length;
- int[] a = new int[n];
- var list = new List<T>();
- for (int i = 0; i<n; i++) {
- a[i] = i;
- list.Add(input[a[i]]);
- }
- reslist.Add(list);
- bool bFound = true;
- while (bFound == true) {
- bFound = false;
- for (int i = n - 2; i >= 0; i--) {
- var curlist = new List<T>();
- if (a[i] < a[i + 1]) { //ищем a[i] такой, что он меньше a[i+1]
- bFound = true;
- int t = n + 1; //большое число для поиска минимума
- int jnumb = -1; //номер для запоминания минимума
- for (int j = i + 1; j < n; j++) //в хвосте последовательности (начиная с i+1) ищем минимальный элемент больший a[i]
- if (a[j] > a[i]) //если нашли число большее a[i]
- if (a[j] < t) { //проверяем что оно меньше чем уже найденное
- t = a[j];
- jnumb = j;
- }
- if (jnumb != -1) { //если нашли такое число, то меняем местами a[i] и a[jnumb]
- int temp = a[i];
- a[i] = a[jnumb];
- a[jnumb] = temp;
- }
- //сортируем хвост последовательности (начиная с i+1)
- Array.Sort(a, i+1, n - i - 1);
- for (int k = 0; k<n; k++)
- curlist.Add(input[a[k]]);
- reslist.Add(curlist);
- break;
- }
- }
- }
- return reslist;
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- //Comb cb = new Comb();
- /*for (double mx = 1.0; mx <= 100; mx++)
- {
- double pro = 1;
- for (double i = 1.0; i <= mx; i += 1.0)
- pro *= (1.0 - (i / 365.0));
- Console.WriteLine($"{mx}: {1-pro}");
- }*/
- /*int i = 0;
- foreach(var item in Comb.SubSetsGeneration(new int[] { 1, 2, 3, 4, 5}))
- Console.WriteLine("{0}: {1}", ++i, String.Join(", ", item));
- */
- /*int j = 0;
- foreach (var item in Comb.RepetitionPlacing(new int[] { 1, 2, 3, 4, 5 }, 2).OrderBy(el => el.Count()))
- Console.WriteLine("{0}: {1}", ++j, String.Join(", ", item));*/
- int k = 0;
- foreach (var item in Comb.Permutations(new int[] { 1, 2, 3, 4, 5 }).OrderBy(el => el.Count()))
- Console.WriteLine("{0}: {1}", ++k, String.Join(", ", item));
- //Console.WriteLine(cb.ToString());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement