C# 输出可能的路由

本文关键字:路由 输出 | 更新日期: 2023-09-27 18:27:21

我有一个动态数组,包含例如(int) {1, 2, 3}

我想生成以下内容:

123 132 213 231 312 321

(注意排序(

我正在考虑为上述内容构建 3 个循环,但是例如,当数组长度为 16 时,该解决方案就不好了,我需要一个动态解决方案。

你能帮忙吗?谢谢。这是针对个人项目。

C# 输出可能的路由

您可以使用优秀的 EvenMoreLINQ 项目中的排列扩展方法。

例:

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

您正在谈论按字典顺序列出数组的所有排列。让我们首先假设我们有一个排列,我们想要生成一个按字典顺序排列的排列。以下是我们必须采取的步骤(这里a数组变量(:

  1. 查找a[i] < a[i+1]的最大i
  2. 查找a[i] < a[j]的最大j
  3. a[i]a[j]交换。
  4. 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;
}