2011-10-01 5 views
2

최근에 여러 가지 조합을 조사해 보았습니다. 여러 가지 타사 솔루션을 시도해 보았습니다. 성공하지 않으면 추가 할 수 있습니다.C#의 특정 조합, 이해할 수 없음

는 난 그냥이를 마무리 할 수 ​​내가 알고 있어요, 당신은 아마 드릴을 얻을, 0-2을 int로 .. 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 

을 말의 모든 가능한 조합 13 길이 문자열을 생성해야 내가 더러운 해결책을 원한다면 반복한다. 모든 지침 또는 포인터를 부탁드립니다.

+1

[permutations] (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 = 1 례보고 무엇을 길이 N의 문자열로 문제를 일반화하자? 그것의입니다

0 
1 
2 

그리고 N = 2의 경우는 어떻게 생겼습니까? 그것은 당신이, 우리가 쉽게 (일명 생성)를 도출 할 수있는 방법은 N = 1의 경우 주어진 볼 수 있습니다 궁금

00 
01 
02 
10 
11 
12 
20 
21 
22 

매우 기계적인 방식으로 N = 2의 경우입니다. 이제이 특정 사례의 패턴을 보면 일반 사례의 패턴이 무엇인지 말할 수 있습니까? 예를 들어 길이 N의 문자열에 대한 답을 이미 손에 넣었다면 길이 N + 1의 문자열에 대한 답을 알려달라고 요청 했습니까? 그렇다면 재귀 알고리즘의 정의가 있습니다.

추신 : 나는이 조합을 순열이라고 부르지 않을까 생각합니다.

+0

몇 가지 사항을 정리하면 다른 초보자에게 물고기를 가르쳐 준 것 같습니다 :) 몇 가지 시도해 보겠습니다. –

0

순열의 목록을 반환하는 함수를 작성했습니다. 그래서 자신의 메서드를 작성할 시간이 없다면, 그것을 사용할 수 있습니다. 길이는 순열 길이이고 최대 값은 최대 숫자입니다 (귀하의 경우 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; 
    } 
관련 문제