用于在3d数组中查找重复(2d)单元格的函数

时间:2010-12-09 00:40:22

标签: c

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

我一直在尝试开发一个函数(原型在上面),它循环通过一个3d数组,该数组可以容纳5张手牌,并且数字索引指向一个表示存在卡的1的单元格基于西装(4)和脸(13)。

例如,如果在假设的手中,第一张牌是7个俱乐部,其索引将是:[1] [3] [7]其中1是牌3 =球杆,7 = 7。

我需要遍历手中的所有五张牌,看看是否有两张相同的牌。

我无法弄清楚如何做到这一点,因为我可以将第一张牌的索引与其他四张牌进行比较,但其余的牌不会相互比较。

如果有重复,则函数返回1,否则返回0。

我很困惑。

谢谢!

2 个答案:

答案 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];

这将更容易使用。例如,要查找重复项,您只需要检查其他任何一张卡是否具有相同的ranksuit值:

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。

检查重复项很容易,只需比较手中的每个整数值。