【问题标题】:Function to find duplicate (2d) cells in a 3d array在 3d 数组中查找重复 (2d) 单元格的函数
【发布时间】:2010-12-09 00:40:21
【问题描述】:

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

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

例如,如果在假设的一手牌中,第一张牌是梅花七,其索引将为:[1][3][7] 其中 1 是牌,3 =梅花,7 = 七。

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

我不知道该怎么做,因为我可以将第一张卡片的索引与其他四张卡片的索引进行比较,但剩下的卡片不会相互比较。

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

我很困惑。

谢谢!

【问题讨论】:

    标签: c


    【解决方案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;
    

    【讨论】:

    • 这是我的想法的一个例子:card1:cards[1][3][7],card3:cards[3][3][7]。它们是不同的卡片,但它们是相同的。
    • 所以您想知道不同手牌中是否有相同的牌?
    • 在手中。在这种情况下,牌可能更适合命名为手。在这手牌的 5 张牌中,我正在寻找相同的两张。
    • 您的数据结构有什么问题:假设比利的眼睛是蓝色的。你会说他有蓝眼睛吗?这听起来很自然,对吧?但是你的数组方法类似于说比利眼睛的蓝色是真的,棕色是假的,绿色是假的,灰色是假的。使用数组将多个逻辑“事物”收集在一起,并使用原始数据来表示事物的属性。
    【解决方案2】:

    您似乎在描述一手牌,它是 5 张(希望是独一无二的)牌的集合。这意味着你想要 5 个对象。但是cards[5][4][13] 是 260 个对象。那将是一个有 5 个插槽的结构,每个插槽可以包含任意数量的任何类型的卡。

    由于我怀疑这是您真正想要的,我建议您将手牌的表示更改为 int cards[5]。在cards 的每个位置中,您将为红桃花色中的每张牌放置一个整数 0-12,为黑桃花色中的每张牌放置一个整数 0-25,等等。如果您还需要一种方法来表示该插槽中没有卡,您可以使用 -1。

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

    【讨论】:

      猜你喜欢
      • 2021-05-08
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2017-09-23
      • 2015-04-13
      • 1970-01-01
      相关资源
      最近更新 更多