【发布时间】:2022-01-09 23:58:04
【问题描述】:
我有一个从 1 到 n 的数字数组,我需要找到所有可能的分区为 3 个数字的不相交组合。
也就是说,对于n = 9,情况如下:
数组:1、2、3、4、5、6、7、8、9;
3的可能组合:123、124 ... 245、246 ... 478、479等;
可能的分区为 3 个不相交的组合:123 456 789、123 457 689 ... 123 468 579 ... 127 458 369 等。
我找到了一种算法,可以从一组数字中找到 3 个数字的组合,这里是:https://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n /(其中甚至有 2 个,但我使用了第一个)。现在的问题是如何找到组合本身的组合,这已经造成了困难:在我看来,为此我需要再次处理递归,但是如何以及在何处使用它,我并不完全理解(也许重点是另一个)。此外,我还看到了一种非递归算法,它可以从给定的数字https://rosettacode.org/wiki/Combinations#C.23 中找到所有组合,但对它无能为力(我将我的工作附在其中)。你能帮帮我吗?
public static IEnumerable<int[]> Combinations(int[] a, int n, int m)
{
int[] result = new int[m];
Stack<int> stack = new Stack<int>();
stack.Push(0);
while (stack.Count > 0)
{
int index = stack.Count - 1;
int value = stack.Pop();
while (value < n)
{
result[index++] = ++value;
stack.Push(value);
if (index == m)
{
for (int i = 0; i < 3; i++)
{
a = a.Where(val => val != result[i]).ToArray();
}
return Combinations (a, n-3, m);
break;
}
}
}
}
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c# arrays algorithm recursion combinations