2010-03-05 48 views
2

我刚刚有一个脑袋,我有一个Deck对象,并且想要以迭代的方式从它得到每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 2010-03-05 14:33:17

+2

你并不真的需要递归。你可以在0开始每个循环,并跳过任何一张牌匹配的情况。尽管如此,递归更好。 – kgrad 2010-03-05 14:40:09