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

相关推荐
苏小瀚3 小时前
算法---位运算
java·算法
天***88963 小时前
js封装一个双精度算法实现
开发语言·前端·javascript
Code小翊3 小时前
归并排序基础理解
数据结构·算法·排序算法
.小小陈.3 小时前
数据结构2:单链表
c语言·开发语言·数据结构·笔记·学习方法
Camel卡蒙3 小时前
数据结构——二叉搜索树Binary Search Tree(介绍、Java实现增删查改、中序遍历等)
java·开发语言·数据结构
2401_841495643 小时前
【数据结构】基于Floyd算法的最短路径求解
java·数据结构·c++·python·算法··floyd
Algebraaaaa3 小时前
什么是前端、后端与全栈开发,Qt属于什么?
开发语言·前端·qt
立志成为大牛的小牛3 小时前
数据结构——二十三、并查集的终极优化(王道408)
开发语言·数据结构·笔记·学习·程序人生·考研
珊珊而川3 小时前
SAUP 算法
算法
寂静山林3 小时前
UVa 1471 Defense Lines
算法