1

長さ 4 の配列へのポインターを渡す関数を作成しています。この配列には整数が含ま0 <= x <= 52れ、渡された配列にないダキネからのすべての整数を使用して長さ 48 の配列を作成したいと考えています。Pythonでは、これは

# just included for specificity
cards = [card for card in deck if card not in hand]

Cで私ができる最善のことは

int i, j, k, found_flag;
int cards[48];    /* int hand[4] is passed in */

k = 0;
for (i = 0; i < 52; i++) {
  found_flag = 0;
  for (j = 0; j < 4; j++) {
    if (i == hand[j]) {
      found_flag = 1;
      break;
    }
  }
  if (!found_flag) {
      cards[k++] = i;
  }
}

これはこの状況に最適ですか? 一般的に、「頼りになる」パターンですか?

4

4 に答える 4

1

これはこのように行うことができますか?

cards_in_deck[48]={1};
for (int i=0;i<4;i++)
    cards_in_deck[hand[i]]=0;

cards_in_deck は、デッキにないカードの値が 1 の配列です。これはあなたが探しているものですか?

于 2010-08-27T05:43:41.940 に答える
1

確かに、あなたの例は手の大きさが 4 しかない場合でも問題ありません。十分に明確です。配列がはるかに大きい状況では、さまざまな種類の並べ替えに基づくより効率的なアルゴリズムを使用できます。

たとえば、基数ソートはネストされたループを排除します。

int i, j;
int card_in_hand[52] = { 0 };
int cards[48];    /* int hand[4] is passed in */

for (i = 0; i < 4; i++)
    card_in_hand[hand[i]] = 1;

j = 0;
for (i = 0; i < 52; i++)
  if (!card_in_hand[i])
      cards[j++] = i;
于 2010-08-27T05:50:30.170 に答える
0

Cでは、手札のソートされたカードを繰り返します。

int cards_in_deck[48];
const int ranges[6][2] = {
    {0,           hand[0]}, 
    {hand[0] + 1, hand[1]},
    {hand[1] + 1, hand[2]},
    {hand[2] + 1, hand[3]},
    {hand[3] + 1, hand[4]},
    {hand[4] + 1, 52}
};
int j = 0;
for (int i = 0; i < sizeof(ranges)/sizeof(ranges[0]); i++) {
    const int *range = ranges[i];
    for (int k = range[0]; k < range[1]; k++)
        cards_in_deck[j++] = k;
}

Pythonでは、コードは次のようになります。

hand = [0, 10, 11, 40, 51]
ranges = [
    [0,           hand[0]], 
    [hand[0] + 1, hand[1]],
    [hand[1] + 1, hand[2]],
    [hand[2] + 1, hand[3]],
    [hand[3] + 1, hand[4]],
    [hand[4] + 1, 52]
]
cards_in_deck = [k for r in ranges for k in range(r[0], r[1])]
于 2011-07-10T22:37:05.757 に答える
0

これは、これを解決するためにまとめた小さなテスト プログラムです。どのカードが選択されているかを示すセットを作成し、セットをスキャンして残っているカードの配列を構築します。

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    int cardsSelected[4] = {3,7,10,49} ;
    int cardsLeft[48] ;
    int allCards[52] ;

    memset(allCards,0,sizeof(int)*52) ;
    for(int i= 0; i < 4; ++i) {
        allCards[cardsSelected[i]] = 1 ;
    }

    int k = 0 ;
    for(int i =0; i < 52; ++i) {
        if (!allCards[i])
            cardsLeft[k++] = i ;
    }

    for(int i = 0; i < 48; ++i) {
        printf("%d ", cardsLeft[i]) ;
    }
    printf("\n") ;

    return 0;
}
于 2010-08-27T06:01:22.783 に答える