首页 > 试题广场 >

纸牌游戏

[编程题]纸牌游戏
  • 热度指数:3625 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}Alex 与 Bob 进行如下纸牌游戏:
\hspace{23pt}\bullet\, 牌面数字均为 1\sim10 的整数;
\hspace{23pt}\bullet\, 每位玩家各有两张暗牌(自己也不知道牌面);
\hspace{23pt}\bullet\, 游戏共两回合,每回合双方各随机翻开一张未翻开的牌并比较大小;
\hspace{23pt}\bullet\, 翻开的牌面数字更大者赢得该回合,若相等则该回合无人获胜;
\hspace{23pt}\bullet\, 两回合结束后,赢得回合数更多者获胜;若平局则无人获胜。

\hspace{15pt}已知四张牌的具体数字:Alex 拥有 a_1,a_2,Bob 拥有 b_1,b_2。牌面分配固定,但翻牌顺序随机。请计算 Alex 最终获胜的不同翻牌顺序数量

输入描述:
\hspace{15pt}第一行输入整数 t\left(1\leqq t\leqq 10^4\right),表示测试用例数量。
\hspace{15pt}每个测试用例一行输入四个整数 a_1,a_2,b_1,b_2\left(1\leqq a_i,b_i\leqq10\right)


输出描述:
\hspace{15pt}对每个测试用例输出一行一个整数,表示 Alex 获胜的翻牌顺序数量。
示例1

输入

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

说明

考虑第一个测试案例,当Alex开始时有牌值为 26 的牌,而Bob开始时有牌值为 38 的牌。游戏可能以 4 种不同的方式进行:

- Alex 翻 3 ,Bob 翻 2 。Alex 赢了第一轮。然后,Alex 翻 8 ,Bob 翻 6 。Alex 同样赢得第二轮。由于 Alex 赢了 2 个回合,所以他赢得了游戏。

- Alex 翻转 3 ,Bob 翻转 6 。Bob赢得第一轮。然后,Alex 翻 8 ,Bob 翻 2 。Alex 赢第二轮。由于双方赢得的回合数相同,因此没有人获胜。

- Alex 翻转 8 ,Bob 翻转 6 。Alex 赢了第一轮。然后,Alex 翻出 3 ,Bob 翻出 2 。Alex 同样赢得第二轮。由于 Alex 赢了 2 轮,所以他赢得了游戏。

- Alex 翻转 8 ,Bob 翻转 2 。Alex 赢了第一轮。然后,Alex 翻 3 ,Bob 翻 6 。Bob赢得这一轮。由于双方赢得的回合数相同,因此没有人获胜。

所以,最终Alex会赢的可能情况只有 2 种。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();

        while (t-- > 0) {
            int a1 = scanner.nextInt();
            int a2 = scanner.nextInt();
            int b1 = scanner.nextInt();
            int b2 = scanner.nextInt();

            int count = 0;

            // Alex的两种翻牌顺序
            int[][] alexOrders = {{a1, a2}, {a2, a1}};
            // Bob的两种翻牌顺序
            int[][] bobOrders = {{b1, b2}, {b2, b1}};

            // 遍历所有可能的翻牌顺序组合
            for (int[] alex : alexOrders) {
                for (int[] bob : bobOrders) {
                    // 计算双方赢得的回合数
                    int alexWins = 0;
                    int bobWins = 0;

                    if (alex[0] > bob[0]) {
                        alexWins++;
                    } else if (alex[0] < bob[0]) {
                        bobWins++;
                    }

                    if (alex[1] > bob[1]) {
                        alexWins++;
                    } else if (alex[1] < bob[1]) {
                        bobWins++;
                    }

                    // 当Alex赢得的回合数多于Bob时,才是Alex获胜
                    if (alexWins > bobWins) {
                        count++;
                    }
                }
            }

            System.out.println(count);
        }

        scanner.close();
    }
}


发表于 2025-08-28 19:05:42 回复(0)