• [编程题-搜狐]扎金花


    [编程题] 扎金花
     两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。
    
    游戏规则:
    共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 
    
    对于牌型的规则如下: 
    1.三张牌一样即为豹子 
    2.三张牌相连为顺子(A23不算顺子) 
    3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型 在牌型一样时,比较牌型数值大小(如AAA>KKK,QAK>534,QQ2>10104) 在二人均无特殊牌型时,依次比较三张牌中最大的。大的人获胜,如果最大的牌一样,则比较第二大,以此类推(如37K>89Q) 如二人牌面相同,则为平局。 


    输入描述:
    输入两个字符串代表两个玩家的牌(如"10KQ" "354"),先输入的作为玩家1,后输入的作为玩家2


    输出描述:
    1 代表 玩家1赢 0 代表 平局 -1 代表 玩家2赢 -2 代表不合法的输入

    输入例子:
    KQ3 3Q9
    10QA 6102
    5810 7KK
    632 74J
    10102 K77
    JKJ 926
    68K 27A

    输出例子:
    1
    1
    -1
    -1
    1
    1
    -1
    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>
    using namespace std;
    int str2dig(string s)
    {
        int n = s.size();
        if (n == 2)
        {
            if (s[0] == '1' && s[1] == '0')
                return 10;
            else
                return -1;
        }
        else if (n == 1)
        {
            switch (s[0])
            {
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9': return s[0] - '2' + 2;
            case 'J': return 11;
            case 'Q': return 12;
            case 'K': return 13;
            case 'A': return 14;
            default: return -1;
            }
        }
        else
            return -1;
    }
    void f(string s, vector<int>& v)
    {
        int n = s.size();
        if (n == 0) return;
        int val;
        if (s[n - 1] == '0' && n >= 2)
        {
            val = str2dig(s.substr(n - 2, 2));
            v.push_back(val);
            if (val == -1)
                return;
            else
                f(s.substr(0, n - 2), v);
        }
        else
        {
            val = str2dig(s.substr(n - 1, 1));
            v.push_back(val);
            if (val == -1)
                return;
            else
                f(s.substr(0, n - 1), v);
        }
    }
    void f1(vector<int>&v)
    {
        if (v[v.size() - 1] == -1) return;
        if (v.size() != 3)
        {
            v.push_back(-1);
            return;
        }
        sort(v.begin(), v.end());
        if (v[0] == v[2])
        {
            v.push_back(4);
            return;
        }
        else if (v[0] + 1 == v[1] && v[1] + 1 == v[2])
        {
            v.push_back(3);
            return;
        }
        else if (v[0] == v[1] || v[1] == v[2])
        {
            if (v[0] == v[1])
                swap(v[0], v[2]);
            v.push_back(2);
            return;
        }
        else
        {
            v.push_back(1);
            return;
        }
    }
    int cmp(vector<int>& lhs, vector<int>& rhs)
    {
        int n = lhs.size();
        if (n == 0) return 1;
        else
        {
            if (lhs[n - 1] > rhs[n - 1]) return 1;
            else if (lhs[n - 1] < rhs[n - 1]) return -1;
            else
            {
                lhs.pop_back();
                rhs.pop_back();
                return cmp(lhs, rhs);
            }
        }
    }
    int main()
    {
        string s1, s2;
        while (cin >> s1 >> s2)
        {
            vector<int> v1;
            vector<int> v2;
            f(s1, v1);
            f(s2, v2);
            f1(v1);
            f1(v2);
            if (v1[v1.size() - 1] == -1 || v2[v2.size() - 1] == -1)
            {
                cout << "-2" << endl;
            }
            else
            {
                int c = cmp(v1, v2);
                if (c == 1) cout << "1" << endl;
                else if (c == -1) cout << "-1" << endl;
                else cout << "0" << endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    SqlServer数据库正在还原的解决办法
    v-表单自动收集信息
    v-按键修饰符
    v-for列表排序
    class与style的绑定
    v计算属性的应用
    v子向父组件传值
    v传值和传引用
    v-父组件向子组件传值
    练习鼠标悬停切换图片页面
  • 原文地址:https://www.cnblogs.com/learning-c/p/5745694.html
Copyright © 2020-2023  润新知