2014-09-18 2 views
0

Я хотел бы получить все возможные комбинации чисел, которые хранятся в массиве.Получить все комбинации из заданных чисел

Например:

Используя первый массив {1,2,3,4} вернуться

1,2,3,4 
1,3,4,2 
1,4,2,3 
2,3,4,1 
2,4,1,3 etc 

Как я мог это сделать?

Чтобы уточнить - возьмите массив чисел: {1,2,3,4}, измените последовательность чисел, верните новый массив (добавьте в список) и повторите, пока не будут найдены все возможные комбинации ,

Благодаря

+0

Итак, оглядываясь, я думаю, что процесс называется перестановкой? – dave88

+0

Голос вниз, большое спасибо за ответ, хотя. – dave88

+1

Я считаю, что это другое сообщение (и ответ) - это то, что вы хотите. [этот другой пост и] [1] [1]: http://stackoverflow.com/questions/21077405/learn-permutation-of-string-vb-net – GertDeWilde

ответ

1

Here is a answer, который содержит именно то, что вы хотите. Если вы прочтете другие ответы, есть несколько других подходов, которые работают быстрее, но они немного сложнее в использовании.

Это код, а не мой собственный.

public static IEnumerable<IEnumerable<T>> QuickPerm<T>(this IEnumerable<T> set) 
{ 
    int N = set.Count(); 
    int[] a = new int[N]; 
    int[] p = new int[N]; 

    var yieldRet = new T[N]; 

    List<T> list = new List<T>(set); 

    int i, j, tmp; // Upper Index i; Lower Index j 

    for (i = 0; i < N; i++) 
    { 
     // initialize arrays; a[N] can be any type 
     a[i] = i + 1; // a[i] value is not revealed and can be arbitrary 
     p[i] = 0; // p[i] == i controls iteration and index boundaries for i 
    } 
    yield return list; 
    //display(a, 0, 0); // remove comment to display array a[] 
    i = 1; // setup first swap points to be 1 and 0 respectively (i & j) 
    while (i < N) 
    { 
     if (p[i] < i) 
     { 
      j = i%2*p[i]; // IF i is odd then j = p[i] otherwise j = 0 
      tmp = a[j]; // swap(a[j], a[i]) 
      a[j] = a[i]; 
      a[i] = tmp; 

      //MAIN! 

      for (int x = 0; x < N; x++) 
      { 
       yieldRet[x] = list[a[x]-1]; 
      } 
      yield return yieldRet; 
      //display(a, j, i); // remove comment to display target array a[] 

      // MAIN! 

      p[i]++; // increase index "weight" for i by one 
      i = 1; // reset index i to 1 (assumed) 
     } 
     else 
     { 
      // otherwise p[i] == i 
      p[i] = 0; // reset p[i] to zero 
      i++; // set new index value for i (increase by one) 
     } // if (p[i] < i) 
    } // while(i < N) 
} 

Используя этот метод расширения, вы могли бы сделать array.QuickParm.Select(innerEnum => innerEnum.ToArray()).ToArray(), чтобы получить результат от этого как массив массивов.

+0

Спасибо, я хорошо посмотрю на это. – dave88

+0

@ dave88 как это сработало для вас? –

-1
Byte[,] square4 = new Byte[,] { { 1, 2, 3, 4 }, { 1, 3, 4, 2 }, { 2, 3, 4, 1 }, { 2, 4, 1, 3 } }; 
+0

голоса Эй вниз. Посмотрите на вопрос перед редактированием. И комментарий. – Paparazzi

+3

Я не был, но я думаю, что OP хочет использовать '{1, 2, 3 4}' как * input * для * генерировать * программно то, что у вас есть «жестко закодировано». – crashmstr

+0

@crashmstr Я понял, что теперь OP обновился. Но несправедливо проголосовать за меня, когда в исходном вопросе неясно, было ли это просто синтаксисом для загрузки двухмерного массива. – Paparazzi

Смежные вопросы