перечисление через каждую пятикарточную комбинацию - PullRequest
2 голосов
/ 05 марта 2010

У меня только что был блок мозга, у меня есть объект 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++){
                }
             }
         }
     }
  }

Это правильно?

Спасибо

1 Ответ

5 голосов
/ 05 марта 2010

Да, это отлично работает. Если вы хотите перечислить все n-карточные комбинации, это не сработает.

Для этого вам понадобится рекурсия. Поместите карту 0 в слот 0. Рекурсивно перечислите все n-1 карт (кроме 0) в оставшиеся n-1 слотов. Повторите это с картой 1 в слоте 0. Довольно просто.

РЕДАКТИРОВАТЬ: некоторый код:

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...