2011-10-01 27 views
2

最近我一直在研究組合,我嘗試了各種第三方解決方案,並試圖讓自己的頭靠近它。沒有成功,我可能會補充說C#中的特定組合,無法掌握它

我需要生成一個13長度字符串的發言權所有可能的組合..詮釋0-2,IE

0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 0 0 0 2 
0 0 0 0 0 0 0 0 0 0 0 1 0 
... 
2 2 2 2 2 2 2 2 2 2 2 2 2 

你可能會得到鑽,我知道我可以在包裝這件事如果我想要一個骯髒的解決方案,循環任何指導或指針表示讚賞。

+1

那些不是[排列](http://en.wikipedia.org/wiki/Permutation)。 – svick

+0

對不起,似乎是我的誤解:) –

回答

0

我不禁想到這只是在基於N的數字系統中添加數字(在您的示例中是3基系統)。

我會寫一個方法(如果還沒有在框架或庫中),這將允許您切換基地。 IE:

String transformNumberFrom10BaseToXBase(int number, int base) 

然後只寫一個for循環(對不起,僞類C代碼:)):

for (int i = 0; i < base^13; i++) { 
    print transformNumberFrom10BaseToXBase(i, base) 
} 

好,希望幫助或者給你如何解決的想法它:)

+0

這看起來也是一種有效的解決方案,即使是清潔劑也是如此。我會研究它。謝謝你的洞察力:) –

4

我很樂意爲您編寫代碼,但似乎您正在尋找直觀的問題。所以也許這更像是一個「教男人釣魚」的時刻。

因此,讓我問你幾個問題:

讓我們概括的問題,以長度爲N串什麼是N = 1的情況下是什麼樣子?它是

0 
1 
2 

那麼N = 2的情況是什麼樣子?這是

00 
01 
02 
10 
11 
12 
20 
21 
22 

我不知道你可以看到,由於N = 1的情況下,我們可以很容易得出(又名產生)的N = 2的情況下在一個非常機械地。現在,如果你看到這個特定情況的模式,你能說出一般情況下的模式嗎?即如果你碰巧已經掌握了長度爲N的字符串的答案,並且我要求你給我提供長度爲N + 1的字符串的答案,你可以這麼做嗎?如果是這樣,你有遞歸算法的定義。

PS我想我會稱這些組合而不是排列組合。

+0

是的,這確實清除了一些東西,你可能已經教另一個新手魚:)我會嘗試一些事情。 –

0

我寫了很快的函數,返回排列列表,所以如果你沒有時間寫自己的方法,你可以使用它。長度是置換長度,max是最大數量(在你的情況下,這將是2)

static List<int[]> getPermutationList(int length, int max) 
    { 
     List<int[]> perm_list = new List<int[]>(); 
     int[] perm = new int[length]; 
     for (int i = 0; i < length; ++i) 
      perm[i] = 0; 
     while(true) 
     { 
      for (int i = length - 1; ; --i) 
      { 
       if (i == -1) 
        return perm_list; 
       if (perm[i] < max) 
       { 
        perm[i]++; 
        for (int j = i + 1; j < length; ++j) 
         perm[j] = 0; 
        break; 
       } 

      } 
      int[] perm_copy = new int[length]; 


      for (int i = 0; i < length; ++i) 
      { 
       perm_copy[i] = perm[i]; 
      } 
      perm_list.Add(perm_copy); 
     } 
     return perm_list; 
    }