2010-03-05 3 views
2

방금 ​​두뇌 블록을 가졌습니다. 데크 개체가 있고 반복적으로 5 장의 카드 조합을 얻고 싶습니다. 어떤 사람이 나에게이 작업을 수행 할 수있는 방법을 보여줄 수 있습니까? 나는 이것이 다음과 같을 것이라고 상상합니다.매 5 카드 조합마다 열거하기

for(int i =0; i <52; i++){ 
    for(int j = i + 1 ; j < 52; j++){ 
     for(int k = j + 1; k < 52; k++{ 
      for(int l = k + 1; l < 52; l++){ 
       for(int m = l + 1; m < 52; m++){ 
       } 
      } 
     } 
    } 
    } 

이 내용이 정확합니까?

감사합니다.

답변

5

예, 제대로 작동합니다. 모든 n 카드 조합을 나열하려면이 방법이 효과가 없습니다.

재귀가 필요합니다. 카드 0을 슬롯 0에 놓습니다. 나머지 n-1 슬롯에있는 모든 n-1 카드 손 (0 제외)을 재귀 적으로 나열하십시오. 슬롯 0에있는 카드 1로 반복하십시오. 아주 쉽습니다.

편집 : 일부 코드 :

private static final int NUM_CARDS = 52; 

public static void main(String[] args) { 
    enumerateAllHands(Integer.parseInt(args[0])); 
} 

private static void enumerateAllHands(int n) { 
    if (n > NUM_CARDS) { 
    throw new IllegalArgumentException(); 
    } 
    int[] cards = new int[n]; 
    BitSet cardsUsed = new BitSet(); 
    enumerate(cards, 0, cardsUsed); 
} 

private static void enumerate(int[] cards, int from, BitSet cardsUsed) { 
    if (from == cards.length) { 
    emit(cards); 
    } else { 
    for (int i = 0; i < NUM_CARDS; i++) { 
     if (!cardsUsed.get(i)) { 
     cards[from] = i; 
     cardsUsed.set(i); 
     enumerate(cards, from + 1, cardsUsed); 
     cardsUsed.clear(i); 
     } 
    } 
    } 
} 

private static void emit(int[] cards) { 
    System.out.println(Arrays.toString(cards)); 
} 
+1

권자는 그 의사 코드로 변환 할 수 – Aly

+2

당신이 정말로하지 않는 재귀가 필요합니다. 0에서 각 루프를 시작하고 카드가 일치하는 경우 건너 뛸 수 있습니다. 더 재귀 적으로. – kgrad