2012-03-09 43 views
0

我有一个动态数组,含有例如(int) {1, 2, 3}C#输出可能路线

我想生成以下内容:

123 132 213 231 312 321

(注意排序)

我想为上述构建3个循环,但当数组长度为16时,该解决方案效果不佳,我需要一个动态解决方案。

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

+0

这将是预期的输出,如果输入的是{1,1,2,3} – PeskyGnat 2012-03-09 18:19:22

+0

那你试试?有没有特定的问题?本网站不会为您编写代码。 – Zasz 2012-03-09 18:19:43

+0

就像我说过的,我想到了多个循环,但由于数组的长度不是恒定的,所以使用起来不太合适。 – Novak 2012-03-09 18:27:14

回答

2

你说的是上市的数组的所有排列字母排序。让我们首先假设我们有一个排列,我们想要生成一个按字典顺序排列的排列。下面是我们必须采取的步骤(这里a无二数组变量):

  1. 查找其a[i] < a[i+1]最大i
  2. 找到最大的j其中a[i] < a[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; 
} 
+0

感谢您的帮助。 – Novak 2012-03-09 18:49:02

+0

我开始编写代码,但似乎被卡住了结构,以及我应该做的一些操作。你能举一个小例子吗?谢谢 – Novak 2012-03-09 18:49:38

+0

@ user1162727,当然,请查看更新后的帖子。 – Andrei 2012-03-09 19:34:38