Нахождение перестановок на двумерном массиве - PullRequest
1 голос
/ 08 октября 2019

У меня есть двумерный массив, подобный этому.

1 2 3
2 3 4

В любом случае, можно ли найти все комбинации, которые соответствуют приведенным ниже требованиям?

Я хочу найти все комбинации, такие как каждаяномер из столбца должен быть выбран.

Например,

{1,2,3}
{1,2,4}
{1,3,3}
{1,3,4}

{2,2,3}
{2,2,4}
{2,3,3}
{2,3,4}

Я понятия не имею, как генерировать все комбинации, как указано выше.

Большое спасибо.

1 Ответ

1 голос
/ 08 октября 2019

Типичным методом создания комбинаций является рекурсивный алгоритм, в котором каждый раз вырезают один элемент и вычисляют комбинации для хвоста.

Например:

public static IEnumerable<IEnumerable<int>> Combinations (int[,] array, int column)
{
    if (column == array.GetLength(1)) 
    {
       yield return Enumerable.Empty<int>();
       yield break;
    };

    for(int j=0; j < array.GetLength(0); j++)
    {
        int v = array[j, column];
        var first = new List<int>{ v };
        foreach (var combination in Combinations(array, column+1))
        {
            yield return first.Concat(combination);
        }
    }
}


public static void Main()
{
    int [,] a = new int [2,3] {
       {1, 2, 3} ,
       {2, 3, 4} ,
    };

    var result = Combinations(a, 0);

    foreach (var t in result)
    {
       Console.WriteLine(string.Join(",", t));
    }

}
...