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

相关推荐
soumns丶涛4 分钟前
ESP32学习(1) - 点亮第一个LED
学习
老秦包你会8 分钟前
C++进阶------C++的类型转换
java·开发语言·c++
星辰烈龙8 分钟前
黑马程序员JavaSE基础加强d2
java·开发语言
superman超哥8 分钟前
仓颉性能瓶颈定位方法深度解析
c语言·开发语言·c++·python·仓颉
是苏浙13 分钟前
零基础入门Java之认识String类
java·开发语言
全栈陈序员14 分钟前
请描述下你对 Vue 生命周期的理解?在 `created` 和 `mounted` 中请求数据有什么区别?
前端·javascript·vue.js·学习·前端框架
岁岁的O泡奶15 分钟前
NSSCTF_crypto_[SWPU 2020]happy
经验分享·python·算法·密码学
代码游侠15 分钟前
应用——UDP Socket 编程笔记
linux·运维·网络·笔记·网络协议·学习·udp
leaves falling17 分钟前
c语言-static和extern
c语言·开发语言
武汉唯众智创17 分钟前
“物联网 Python 开发教程”课程教学解决方案
开发语言·python·物联网·物联网技术·物联网 python 开发·python 开发