我有一个动态数组,包含例如(int) {1, 2, 3}
我想生成以下内容:
123
132
213
231
312
321
(注意排序)
我正在考虑为上面构建3个循环,但是当数组长度为16时,该解决方案不能很好地完成,我需要动态解决方案。
你能帮忙吗?谢谢。这是个人项目。答案 0 :(得分:2)
您可以使用优秀Permutations Extension Method中的EvenMoreLINQ project。
示例:的
foreach (var p in new int[] { 1, 2, 3 }.Permutations())
{
Console.WriteLine(string.Join(", ", p));
}
输出:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
答案 1 :(得分:2)
您正在讨论以字典顺序列出数组的所有排列。让我们首先假设我们有一个排列,我们想要生成下一个按字典顺序排列的排列。以下是我们必须采取的步骤(此处a
用于数组变量):
i
。a[i] < a[i+1]
j
。a[i] < a[j]
a[i]
交换a[j]
。a[i+1]
和a[n-1]
之间的反向元素(包括两者)。现在从第一个排列开始(基本上是一个排序数组),我们可以逐个使用这些步骤逐个生成所有排列,直到我们在第一步中找不到i
。当发生这种情况时,这意味着我们只是按字典顺序产生了最后的排列。
更新:这是代码示例 - 函数,它接受表示排列的数组,并按字典顺序生成(并打印)下一个排列。
/// <summary>
/// Generates and prints next permutation lexicographically.
/// </summary>
/// <param name="a">An array representing a permutation.</param>
/// <returns><c>true</c> if next permutation was generated succesfully, <c>false</c> otherwise.</returns>
public bool PrintNextPermutation(int[] a)
{
int i = a.Length - 2;
while (i >= 0 && a[i] >= a[i + 1]) i--;
if (i <0)
{
// it was the last permutation
return false;
}
int j = a.Length - 1;
while (a[i] >= a[j]) j--;
int temp = a[i];
a[i] = a[j];
a[j] = temp;
Array.Reverse(a, i + 1, a.Length - (i + 1));
foreach (int item in a)
{
Console.Write(item + " ");
}
Console.WriteLine();
return true;
}