【C语言】打牌游戏

相信你是最棒哒!!!


题目描述 

Suneet 和 Slavic 玩一个卡牌游戏。游戏规则如下:

  • 每张卡片的整数值在 1 和 10之间。
  • 每位玩家获得 2 张面朝下的卡片(因此玩家不知道自己的卡片)。
  • 游戏是回合制的,且 恰好进行两轮。在每轮中,两位玩家随机选择一张 未翻开的 卡片并翻开。翻开卡片数字严格较大的玩家赢得该轮。如果数字相等,则无人获胜。
  • 如果一位玩家赢得的轮数超过另一位玩家(即严格大于),则该玩家赢得游戏。如果轮数相等,则无人获胜。

由于 Suneet 和 Slavic 不是最好的朋友,你需要计算 Suneet 最终获胜的游戏可能性数量。

为了更好地理解,请查看备注部分。

输入

第一行包含一个整数 𝑡 (1≤𝑡≤104) — 测试用例的数量。 

每个测试用例的唯一一行包含 44 个整数 𝑎1​, 𝑎2, 𝑏1, 𝑏2 (1≤𝑎1,𝑎2,𝑏1,𝑏2≤10),其中 𝑎1​ 和 a2​ 代表 Suneet 拥有的卡片,而 b1​ 和 b2​ 代表 Slavic 拥有的卡片。

输出

对于每个测试用例,输出一个整数 — Suneet 在所有可能的游戏中获胜的游戏数量。

示例

InputOutput
5
3 8 2 6
1 1 1 1
10 10 2 2
1 1 10 10
3 8 7 2
2
0
4
0
2

备注

考虑第一个测试用例,当 Slavic 拥有值为 2 和 6 的卡片,而 Suneet 拥有值为 3 和 8 的卡片时。游戏可能以 4 种不同的方式进行:

  • Suneet 翻开 3,Slavic 翻开 2。Suneet 赢得第一轮。然后,Suneet 翻开 8,Slavic 翻开 66。Suneet 也赢得第二轮。由于 Suneet 赢得了 2 轮,他赢得了游戏。

  • Suneet 翻开 3,Slavic 翻开 6。Slavic 赢得第一轮。然后,Suneet 翻开 8,Slavic 翻开 2。Suneet 赢得第二轮。由于两位玩家赢得的轮数相等,没人获胜。

  • Suneet 翻开 8,Slavic 翻开 6。Suneet 赢得第一轮。然后,Suneet 翻开 3,Slavic 翻开 2。Suneet 也赢得第二轮。由于 Suneet 赢得了 2 轮,他赢得了游戏。

  • Suneet 翻开 8,Slavic 翻开 2。Suneet 赢得第一轮。然后,Suneet 翻开 3,Slavic 翻开 6。Slavic 赢得这一轮。由于两位玩家赢得的轮数相等,没人获胜。

正确代码

注释版

#include <stdio.h> 

int main() { 
    int t;
    scanf("%d", &t); 

    while (t--) { // 使用while循环来处理每一个测试用例,每次循环处理一个用例,直到t减到0
        int a1, a2, b1, b2; // 定义四个整数变量,分别用于存储Suneet和Slavic手中的两张卡牌的数值
        scanf("%d %d %d %d", &a1, &a2, &b1, &b2); // 从标准输入读取四个整数,分别存储在变量a1, a2, b1, b2中
        int cnt = 0; // 定义一个计数器变量cnt,用于记录Suneet赢牌的组合数量,初始值为0

        // 判断第一种出牌情况:Suneet出a1对Slavic的b1,Suneet出a2对Slavic的b2
        if ((a1 > b1 && a2 >= b2) || (a1 >= b1 && a2 > b2)) 
            cnt++; // 如果Suneet的a1大于Slavic的b1,并且a2大于等于b2;或者a1大于等于b1,并且a2大于b2,则Suneet在这种情况下赢,cnt加1

        // 判断第二种出牌情况:Suneet出a1对Slavic的b2,Suneet出a2对Slavic的b1
        if ((a1 > b2 && a2 >= b1) || (a1 >= b2 && a2 > b1)) 
            cnt++; // 如果Suneet的a1大于Slavic的b2,并且a2大于等于b1;或者a1大于等于b2,并且a2大于b1,则Suneet在这种情况下赢,cnt加1

        printf("%d\n", cnt * 2); // 输出Suneet赢牌的组合数量,由于每种情况都有两种出牌顺序(即先后顺序),所以将cnt乘以2
    }
    return 0; 
}

简洁版

#include <stdio.h> 
int main() {
    int t; 
    scanf("%d", &t); 
    while (t--) { 
        int a1, a2, b1, b2; 
        scanf("%d %d %d %d", &a1, &a2, &b1, &b2);
        int cnt = 0; 
        if ((a1 > b1 && a2 >= b2) || (a1 >= b1 && a2 > b2))
            cnt++; 
        if ((a1 > b2 && a2 >= b1) || (a1 >= b2 && a2 > b1))
            cnt++; 
        printf("%d\n", cnt * 2);
    }
    return 0; 
}

总结

在这个卡牌游戏中,每个玩家都有两张牌,每轮游戏双方各出一张牌。由于出牌的顺序有两种可能性(即玩家A先出牌或玩家B先出牌),所以对于每一种牌的组合情况,实际上有两种不同的出牌顺序。

例如,如果Suneet有牌a1a2,Slavic有牌b1b2,那么可能的出牌顺序有:

  1. Suneet出a1对Slavic的b1,然后Suneet出a2对Slavic的b2
  2. Suneet出a1对Slavic的b2,然后Suneet出a2对Slavic的b1
  3. Suneet出a2对Slavic的b1,然后Suneet出a1对Slavic的b2
  4. Suneet出a2对Slavic的b2,然后Suneet出a1对Slavic的b1

这四种出牌顺序中,第1和第4种是Suneet先出a1,第2和第3种是Suneet先出a2。对于每一种牌的组合,都有这样两种出牌顺序,所以对于每一种赢牌的组合情况,实际上有两倍的出牌方式。这就是为什么在计算Suneet赢牌的组合数量时,需要将cnt乘以2的原因。这样做是为了考虑到所有可能的出牌顺序,确保我们计算的是所有可能的游戏结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值