[编程题-搜狐]扎金花

[编程题] 扎金花
 两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。

游戏规则:
共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;
}
原文地址:https://www.cnblogs.com/learning-c/p/5745694.html