首页 > 试题广场 >

纸牌游戏

[编程题]纸牌游戏
  • 热度指数:3566 时间限制: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)
#include <iostream>
using namespace std;

int main() {
    int T;
    cin>>T;
    while(T--){
        int count;
        int a1,a2;
        int b1,b2;
        cin>>a1>>a2>>b1>>b2;
        int a_max = a1 >= a2 ? a1 : a2;
        int a_min = a1 >= a2 ? a2 : a1;
        int b_max = b1 >= b2 ? b1 : b2;
        int b_min = b1 >= b2 ? b2 : b1;

        if((b_min <= b_max && a_min >= b_max && a_max > a_min) || (b_min < b_max && a_min >= b_max && a_max >= a_min) || (b_min <= b_max && a_min > b_max && a_max >= a_min)){
            count = 4;
        }else if((b_min < a_min && b_max > a_min && a_max >= b_max) || (b_min <= a_min && b_max > a_min && a_max > b_max)){
            count = 2;
        }else{
            count = 0;
        }
        cout<<count<<endl;
    }
}
发表于 2025-08-08 17:40:59 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int rows =  in.nextInt();
        for (int i = 0; i < rows; i++) {
            int a1 = in.nextInt();
            int a2 = in.nextInt();
            int b1 = in.nextInt();
            int b2 = in.nextInt();
            //System.out.println(a1 + " " + a2 + " " + b1 + " " + b2);
            processOne(a1, a2, b1, b2);
        }

    }

    private static void processOne(int a1, int a2, int b1, int b2) {
        // Alex 固定时,B的出牌组合
        int b[][] = {{b1, b2}, {b2, b1} };
        int wincount = 0;
        for (int[] t : b) {
            // 第一局:赢下 +1,输了-1
            int wins_1 = t[0] < a1 ? 1 : (t[0] > a1 ? -1 : 0);
            // 第二局:赢下 +1,输了-1
            int wins_2 = t[1] < a2 ? 1 : (t[1] > a2 ? -1 : 0);
            // 计算两局结果
            if (wins_1 + wins_2 > 0) {
                wincount++;
            }
        }
        // 在Alex 调整顺序会再获胜一次
        System.out.println(wincount * 2);
    }
}
发表于 2025-12-06 20:54:02 回复(0)
不太优雅
def main():
    t = int(input())
    for _ in range(t):
        array = list(map(int,input().split()))
        ans = 0
        
        if array[0] > array[2] and array[1] > array[3]&nbs***bsp;array[0] > array[2] and array[1] == array[3]&nbs***bsp;array[0] == array[2] and array[1] > array[3]:
            ans+=1
        if array[0] > array[3] and array[1] > array[2]&nbs***bsp;array[0] > array[3] and array[1] == array[2]&nbs***bsp;array[0] == array[3] and array[1] > array[2]:
            ans+=1
        if array[1] > array[2] and array[0] > array[3]&nbs***bsp;array[1] > array[2] and array[0] == array[3]&nbs***bsp;array[1] == array[2] and array[0] > array[3]:
            ans+=1
        if array[1] > array[3] and array[0] > array[2]&nbs***bsp;array[1] > array[3] and array[0] == array[2]&nbs***bsp;array[1] == array[3] and array[0] > array[2]:
            ans+=1

        print(ans)
        

if __name__ == '__main__':
    main()


发表于 2025-11-19 15:39:48 回复(0)
#include <bits/stdc++.h>
using namespace std;
int ok;
int a[2],b[2];
bool x[2],y[2];
void dfs(int n,int sum,int s){
	if(n>=2){
		if(sum>=2) ok++;
        if(sum==1&&s==1) ok++;
		return;
	}
	for(int i=0;i<2;i++){
		if(!x[i]){
			x[i]=1;
			for(int j=0;j<2;j++){
				if(!y[j]){
					y[j]=1;
					if(a[i]>b[j]) dfs(n+1,sum+1,s);
                    else if(a[i]==b[j]) dfs(n+1,sum,s+1);
					else{
						y[j]=0;
						continue;
					}
					y[j]=0;
				}
			}
			x[i]=0;
		}
	}
	return;
}
int main() {
	int t;cin>>t;
	while(t--){
		ok=0;
		for(int i=0;i<2;i++){
            cin>>a[i];
            x[i]=0;
            }
		for(int i=0;i<2;i++){
            cin>>b[i];
            y[i]=0;
        }
		dfs(0,0,0);
		cout<<ok<<'\n';
	}
	return 0;
}
// 64 位输出请用 printf("%lld")

发表于 2025-11-11 21:30:31 回复(0)
#include <cstdio>
#include <iostream>
using namespace std;

bool check(int a1,int b1,int a2,int b2){
    if(a1>b1&&a2>b2)return true;
    if(a1==b1&&a2>b2)return true;
    if(a1>b1&&a2==b2)return true;
    return false;
}

int main() {

    int t;scanf("%d",&t);
    int a1,a2,b1,b2;
    while(t--){
        scanf("%d %d %d %d",&a1,&a2,&b1,&b2);
        int cnt=0;
        if(check(a1,b1,a2,b2))cnt++;
        if(check(a1,b2,a2,b1))cnt++;
        if(check(a2,b1,a1,b2))cnt++;
        if(check(a2,b2,a1,b1))cnt++;
        printf("%d\n",cnt);
    }
}
// 简单暴力,轻松愉快^--^
发表于 2025-10-18 14:02:30 回复(0)
n = int(input())
for i in range(n):
    a1,a2,b1,b2 = map(int,input().split())
    max_a = max(a1,a2)
    min_a = min(a1,a2)
    max_b = max(b1,b2)
    min_b = min(b1,b2)
    if max_a > max_b:
        if min_a >= max_b:
            print(4)
        elif min_a < max_b and min_a >= min_b:
            print(2)
        else:
            print(0)
    elif max_a == max_b:
        if min_a == max_b and min_a>min_b:
            print(4)
        elif min_a < max_b and min_a > min_b:
            print(2)
        else:
            print(0)
    else:
        print(0)
发表于 2025-10-02 18:15:15 回复(0)
import sys

t = int(input())
for _ in range(t):
    a1,a2,b1,b2 = map(int, input().split())
    res = 0
    if ((a1 - b1 > 0) and (a2 - b2 == 0)) or ((a2 - b2 > 0) and (a1 - b1 == 0)) or ((a1 - b1 > 0) and (a2 - b2 > 0)):
        res += 1
    if ((a1 - b2 > 0) and (a2 - b1 == 0)) or ((a2 - b1 > 0) and (a1 - b2 == 0)) or ((a1 - b2 > 0) and (a2 - b1 > 0)):
        res += 1
    if ((a2 - b1 > 0) and (a1 - b2 == 0)) or ((a1 - b2 > 0) and (a2 - b1 == 0)) or ((a2 - b1 > 0) and (a1 - b2 > 0)):
        res += 1
    if ((a2 - b2 > 0) and (a1 - b1 == 0)) or ((a1 - b1 > 0) and (a2 - b2 == 0)) or ((a2 - b2 > 0) and (a1 - b1 > 0)):
        res += 1
    print(res)

发表于 2025-09-19 22:27:42 回复(0)
#include <iostream>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t,a1,a2,b1,b2,n;
    cin>>t;
    while(t--){
        cin>>a1>>a2>>b1>>b2;
        n=0;
        if((a1>b1&&a2>=b2)||(a1>=b1&&a2>b2))
        n+=2;
        if((a1>b2&&a2>=b1)||(a1>=b2&&a2>b1))
        n+=2;
        cout<<n<<'\n';
    }
}

发表于 2025-09-14 15:37:24 回复(0)
import sys

def solve(nums:list)->str:
    a1,a2,b1,b2 = nums
    a_cnt = 0
    b_cnt = 0
    a_win = 0

    if a1 > b1:
        a_cnt+=1
    elif b1 > a1:
        b_cnt+=1
    
    if a2 > b2:
        a_cnt+=1
    elif b2 > a2:
        b_cnt+=1
    
    if a_cnt > b_cnt:
        a_win += 2

    a_cnt = 0
    b_cnt = 0

    if a1 > b2:
        a_cnt+=1
    elif b2 > a1:
        b_cnt+=1
    
    if a2 > b1:
        a_cnt+=1
    elif b1 > a2:
        b_cnt+=1
    
    if a_cnt > b_cnt:
        a_win += 2
    
    return str(a_win)
    



n = input()
nums_list = [list(map(int,nums.split())) for nums in sys.stdin]
output = list(map(solve,nums_list))
print('\n'.join(output))

发表于 2025-09-01 16:34:12 回复(0)
t = int(input())
for i in range(t):
    a1,a2,b1,b2 = map(int,input().split())
    count = 0
    if a1>b1 and a2>=b2:
        count += 2
    if a1>b2 and a2>=b1:
        count += 2
    if a1==b1 and a2>b2:
        count += 2
    if a1==b2 and a2>b1:
        count += 2
    print(count)
发表于 2025-08-25 00:06:45 回复(0)
#include <iostream>
using namespace std;


int winc(int a1, int a2, int b1, int b2) {
    int aw = 0, bw = 0;

    if ((a1 > b1 && a2 > b2) || (a1 == b1 && a2 > b2) || a1 > b1 &&
            a2 == b2 ) aw += 2;
    if ((a1 > b2 && a2 > b1) || (a1 == b2 && a2 > b1) || (a1 > b2 &&
            a2 == b1)) aw += 2;

    return aw;

}

int main() {
    int n;
    cin >> n;
    while (n--) {
        int a1, a2, b1, b2;
        cin >> a1 >> a2 >> b1 >> b2;
        cout << winc(a1, a2, b1, b2) << endl;
    }

}
发表于 2025-08-04 23:41:41 回复(0)