int duplicate (int cards[5][4][13])
我一直在尝试开发一个函数(原型在上面),它循环通过一个3d数组,该数组可以容纳5张手牌,并且数字索引指向一个表示存在卡的1的单元格基于西装(4)和脸(13)。
例如,如果在假设的手中,第一张牌是7个俱乐部,其索引将是:[1] [3] [7]其中1是牌3 =球杆,7 = 7。
我需要遍历手中的所有五张牌,看看是否有两张相同的牌。
我无法弄清楚如何做到这一点,因为我可以将第一张牌的索引与其他四张牌进行比较,但其余的牌不会相互比较。
如果有重复,则函数返回1,否则返回0。
我很困惑。
谢谢!
答案 0 :(得分:1)
解决此问题的一种方法是遍历每个可能的卡,并计算它出现的次数:
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;
答案 1 :(得分:1)
你似乎在描述一只手牌,它是5张(希望是唯一的)牌的集合。这意味着你想要5个物体。但是cards[5][4][13]
是260个对象。那将是一个有5个插槽的结构,每个插槽可以包含任意数量的任何类型的卡。
由于我怀疑这是你真正想要的,我建议你把手的表示改为int cards[5]
。在cards
中的每个位置,你会在心脏套装中为每张卡片放置0-12的整数,在黑桃套装中为每张卡片放置13-25,对于俱乐部和钻石等等。如果您还需要一种方法来表示该插槽中没有卡,则可以使用-1。
检查重复项很容易,只需比较手中的每个整数值。