Перебрать все возможные варианты расположения заполненных ячеек (комбинаторика) - C#

Узнай цену своей работы

Формулировка задачи:

Есть 12 парных элементов, это значит что каждый элемент имеет две ячейки (всего 24 ячейки получается). 4 ячейки из 24 всегда заполнены. Каждый парный элемент может иметь только одну заполненную ячейку, это значит что те 4 заполненные ячейки находятся в 4 разных элементах. Задание: перебрать все возможные варианты расположения этих заполненных ячеек. Также, если в 1 элементе первая ячейка заполнена, а вторая нет, и в другом варианте в этом же элементе первая ячейка пустая, а вторая нет, то это считается за два разных варианта, следовательно, важна последовательность. Если представить это в виде массива, то первый вариант будет таким: |10|10|10|10|00|00|00|00|00|00|00|00| Второй, возможно, будет таким (изменение подчеркнуто): |10|10|10|01|00|00|00|00|00|00|00|00| А вот неверный вариант: |10|10|11|00|00|00|00|00|00|00|00|00| Общие условия: Требуется написать перебор на языке C#. Программа должна перебирать все варианты как можно быстро, потому более двух вложенных циклов использовать запрещается.

Решение задачи: «Перебрать все возможные варианты расположения заполненных ячеек (комбинаторика)»

textual
Листинг программы
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication198
{
    class Program
    {
        static void Main()
        {
            var cells = new Cell[12];
            foreach (var perm in GetPermutations(cells, 0, 4))
                Console.WriteLine(string.Join("", perm));
            
            Console.ReadLine();
        }
 
        public static IEnumerable<Cell[]> GetPermutations(Cell[] cells, int startPos, int count)
        {
            if (count == 0)
                yield return cells;
            else
            //позиция моей ячейки
            for(int i = startPos;i<cells.Length;i++)
            {
                //вариант 1
                cells[i] = Cell._01;
                //возвращаем перестановки следующих ячеек
                foreach(var next in GetPermutations(cells, i + 1, count - 1)) 
                    yield return next;
                //вариант 2
                cells[i] = Cell._10;
                //возвращаем перестановки следующих ячеек
                foreach (var next in GetPermutations(cells, i + 1, count - 1)) 
                    yield return next;
                //возвращаем как было
                cells[i] = Cell._00;
            }
        }
    }
 
    enum Cell
    {
        _00,
        _01,
        _10
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы