• C++模拟题[第一周-T1] 扑克


    [第一周-T1] 扑克

    题目描述

    斗地主是一种使用 A \tt A A K \tt K K 加上大小王的共 54 54 54 张扑克牌来进行的游戏,其中大小王各一张,其它数码牌各四张。在斗地主中,牌的大小关系根据牌的数码表示如下:

    3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A < 2 < 小王 wxy < 大王 \tt 3<4<5<6<7<8<9<103<4<5<6<7<8<9<10<J<Q<K<A<2<小王wxy<大王

    游戏开始时,将会给 3 3 3 名玩家各自发放 17 17 17 张牌作为手牌,余下三张作为底牌。玩家会将牌从大到小排序理好,然后根据自己牌型的好坏程度来选择是否叫地主。

    你认为,如果自己的手牌中存在王炸(即大小王各一张)或者至少一个炸弹(即四张数码相同的牌),则你会选择叫地主。

    请实现一个程序来判断你是否应该叫地主。

    输入格式

    本题包含多组数据。

    • 第一行输入一个整数 T T T,表示数据组数。
    • 接下来 T T T 行,每行输入一个长度为 17 17 17 的字符串,表示你的手牌。保证牌已经预先理好。在输入中使用 T \tt T T 代表点数为 10 \tt 10 10 的牌,使用 X \tt X X 代表小王,使用 D \tt D D 代表大王。

    输出格式

    • 输出共 T T T 行。
    • 对于每组数据,输出一行一个字符串:
      • Yes 代表你应该叫地主。
      • No 代表你不应该叫地主。

    样例 #1

    样例输入 #1

    3
    X2AAKKKKQT9765433
    DX22AKKQJTT884443
    X2AAAKQQJT8554433
    
    • 1
    • 2
    • 3
    • 4

    样例输出 #1

    Yes
    Yes
    No
    
    • 1
    • 2
    • 3

    提示

    【样例 1 解释】

    第一组数据存在 4 4 4 个 K,是一组炸弹,可以叫地主;

    第二组数据存在王炸(D、X),即大小王各一张,可以叫地主;

    第三组数据不存在王炸和炸弹。故选择不叫地主。

    【数据范围】

    对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1T104保证牌已经预先理好

    注意!
    对于我来说是一个非常严峻的问题。第一次没有考虑到可能连续5个及以上的牌数,所以要在叫地主函数中count>=4。另一个严峻的问题就是没有考虑到2其实也可以放进数字判断循环中,儿T作为10,应放在alpha数组,我却忽虑掉了它。所以一下是正确代码:

    #include 
    #include 
    using namespace std;
    
    //3<4<5<6<7<8<9<10
    
    //X or D
    //bomb !=0
    bool shouldCallLandlord(const string& hand) {
        char alpha[10]={'J','Q','K','A','T'};
        int countJokers = 0;
        int countBomb = 0;
        
        for (char card : hand) {
            if (card == 'X' || card == 'D') {
                countJokers++;
            }
        }
        
        for (char c = '2'; c <= '9'; c++) {
            int count = 0;
            for (char card : hand) {
                if (card == c) {
                    count++;
                }
            }
            if (count >= 4) {
                countBomb++;
            }
        }
        for(int i=0;i<=4;i++){
            int count = 0;
            for(char card : hand){
                if(card == alpha[i]){
                    count++;
                }
            }
            if(count>=4){
                countBomb++;
            }
        }
        return countJokers == 2 || countBomb > 0;
    }
    
    int main() {
        int T;
        cin >> T;
        
        for (int i = 0; i < T; i++) { //T组数据
            string hand; //手牌
            cin >> hand;
            
            if (shouldCallLandlord(hand)) {
                cout << "Yes" << endl;
            } else {
                cout << "No" << endl;
            }
        }
        
        return 0;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    一文搞定,JMeter的三种参数化方式
    Matlab求解椭球上运动的点B,满足到定点A、C的距离之和最短
    详解LockSupport的使用
    元素实现拖拽效果react-dnd+react-dnd-html5-backend
    Java获取实时摄像头进行拍照(附源码)
    【夜读】自我提升的8个好习惯,迷茫时看一看
    Android—过渡按钮的简单实现
    2022 IDC中国数字金融论坛 | 筑基金融信创 共话金融科技新愿景
    目标检测学习--yolo v4
    Linux网络编程6——poll和epoll
  • 原文地址:https://blog.csdn.net/GeekAlice/article/details/133465357