Функция для поиска дубликатов (2d) ячеек в трехмерном массиве - PullRequest
0 голосов
/ 09 декабря 2010

int duplicate (int cards[5][4][13])

Я пытался разработать функцию (прототип приведен выше), которая перебирает трехмерный массив, содержащий 5 карт руки, и числовой индекс ячейки, содержащей 1, указывающий, что карта существует, основан на костюм (4) и лицо (13).

Например, если в гипотетической раздаче первой картой была семерка треф, то ее индекс был бы: [1] [3] [7] где 1 - карта 3 = трефы, а 7 = семерки.

Мне нужно перебрать все пять карт в руке и выяснить, есть ли две одинаковые карты.

Я не могу понять, как это сделать, потому что я мог сравнить индекс первой карты с остальными четырьмя, но тогда оставшиеся карты не будут сравниваться друг с другом.

Функция возвращает 1, если есть дубликат, или 0, если нет.

Я очень смущен.

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Вы, кажется, описываете руку, которая представляет собой коллекцию из 5 (возможно, уникальных) карт. это означает, что вы хотите 5 объектов. Но cards[5][4][13] - это 260 объектов. Это было бы для структуры с 5 слотами, и каждый слот может содержать любое количество карт любого типа.

Поскольку я подозреваю, что вы действительно этого хотите, я посоветую вам изменить представление руки на int cards[5]. В каждой позиции в cards вы ставите целое число 0-12 для каждой карты масти черв, 13-25 для каждой карты масти пиков и так далее для булав и алмазов. Если вам также нужен способ не отображать ни одной карты в этом слоте, вы можете использовать -1.

Проверка на наличие дубликатов проста, просто сравните каждое целое значение в руке.

1 голос
/ 09 декабря 2010

Один из способов сделать это - перебрать каждую возможную карту и подсчитать, сколько раз она появляется:

int suit;

for (suit = 0; suit < 4; suit++) {
    int rank;

    for (rank = 0; rank < 13; rank++) {
        int count = 0;
        int card;

        for (card = 0; card < 5; card++) {
            count += cards[card][suit][rank];
        }

        if (count > 1)
            return 1;
    }
}

return 0;

Однако структура данных, которую вы используетевыбрано не очень эффективно.Чтобы выяснить, что такое карта N, вам нужно перебрать все cards[N][0..3][0..12], чтобы найти 1. Лучше всего было бы использовать struct:

struct card {
    int suit; /* 0..3 */
    int rank; /* 0..12 */
};

struct card cards[5];

Это будет намного прощеработать с.Например, чтобы найти дубликаты, вам просто нужно проверить, имеют ли другие карты одинаковые значения rank и suit:

int card1, card2;

for (card1 = 0; card1 < 5; card1++)
    for (card2 = card1 + 1, card2 < 5; card2++)
        if (cards[card1].suit == cards[card2].suit && cards[card1].rank == cards[card2].rank)
            return 1;
return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...