【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 在所有可能的游戏中获胜的游戏数量。

示例

Input Output
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的原因。这样做是为了考虑到所有可能的出牌顺序,确保我们计算的是所有可能的游戏结果。

相关推荐
Gyoku Mint4 分钟前
机器学习×第五卷:线性回归入门——她不再模仿,而开始试着理解你
人工智能·python·算法·机器学习·pycharm·回归·线性回归
蒙奇D索大8 分钟前
【11408学习记录】考研数学攻坚:行列式本质、性质与计算全突破
笔记·学习·线性代数·考研·机器学习·改行学it
幼稚诠释青春13 分钟前
面试实例题
java·开发语言
weixin_4576653916 分钟前
C++11新标准
开发语言·c++
阿蒙Amon16 分钟前
C#封装HttpClient:HTTP请求处理最佳实践
开发语言·http·c#
moxiaoran575316 分钟前
uni-app学习笔记二十四--showLoading和showModal的用法
笔记·学习·uni-app
DartistCode28 分钟前
动手学深度学习pytorch(第一版)学习笔记汇总
pytorch·深度学习·学习
汤姆和佩琦31 分钟前
LLMs基础学习(八)强化学习专题(1)
深度学习·学习·强化学习·马尔可夫决策过程
大白爱琴34 分钟前
使用python进行图像处理—像素级操作与图像算术(4)
开发语言·图像处理·python
蒙奇D索大38 分钟前
【数据结构】图论最短路径算法深度解析:从BFS基础到全算法综述
数据结构·算法·图论·广度优先·图搜索算法