Функция поиска дубликатов (2d) ячеек в 3d-массиве
int duplicate (int cards[5][4][13])
Я пытаюсь разработать функцию (прототип выше), которая проходит через трехмерный массив, который содержит 5 карт руки, и числовой индекс в ячейке, которая содержит 1, указывающую, что карта существует, основана на костюм (4) и лицо (13).
Например, если в гипотетической руке первая карта состояла из семи клубов, ее индекс был бы: [1] [3] [7] где 1 - карта 3 = клубы и 7 = семерки.
Мне нужно пропустить все пять карт в руке и выяснить, есть ли две одинаковые карты.
Я не могу понять, как это сделать, потому что я мог сравнить индекс первой карты с остальными четырьмя, но остальные карты не сравнивались бы друг с другом.
Функция возвращает 1, если есть дубликат, или 0, если нет.
Я очень смущен.
Спасибо!
Один из способов приблизиться к этому - перебрать все возможные карты и подсчитать, сколько раз оно появляется:
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;
Кажется, вы описываете руку, которая представляет собой коллекцию из 5 (мы надеемся, уникальных) карт. это означает, что вы хотите 5 объектов. Но cards[5][4][13]
- 260 объектов. Это будет для структуры с 5 слотами, и каждый слот может содержать любое количество карт любого типа.
Так как я подозреваю, что вы действительно этого хотите, я советую вам изменить ваше представление руки на int cards[5]
. В каждой позиции в cards
вы помещаете целое число 0-12 для каждой карты в костюме сердца, 13-25 для каждой карты в ложе и т.д. Для клубов и бриллиантов. Если вам также нужен способ представить карту в этом слоте, вы можете использовать -1.
Проверка дубликатов проста, просто сравните каждое целочисленное значение в руке.