2012-03-09 71 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