Функция поиска дубликатов (2d) ячеек в 3d-массиве

108
8

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


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


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


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


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


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


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


Спасибо!

спросил(а) 2010-12-09T03:40:00+03:00 9 лет, 11 месяцев назад
1
Решение
58

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


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;

ответил(а) 2010-12-09T03:45:00+03:00 9 лет, 11 месяцев назад
60

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


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

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

ответил(а) 2010-12-09T03:58:00+03:00 9 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема