R7-3 斗牛

R7-3 斗牛

分数 15

全屏浏览题目

切换布局

作者 黄龙军单位 绍兴文理学院

牛年,三月中旬,周六,诺诺和诺爸玩起了“斗牛”纸牌游戏。斗牛玩法如下:对于一副扑克牌,每人发5张牌,根据牌面计算出各自是牛几(牛1,牛2,……,牛9,牛10),然后比较牛大小,牛大者胜,若牛一样大或者都无牛(牛0),则和局。牛几的计算方法:任取3张牌,把牌面值累加凑成10的倍数(若无法凑成则无牛),设剩下2张牌面值加起来的和S,若S为10的倍数则为牛10(双牛),否则用S(S小于10的情况)或用S减去10(S大于10的情况)的结果确定,例如,牌面4 3 4 6 10时,为牛7。牌面值为2至10,牌面A表示牌面值1,牌面为J、Q、K则按牌面值等于10对待。现在给你10张牌,前5张为诺诺的牌面,后5张为诺爸的牌面,请判断诺诺能否获胜。

输入格式:

首先输入一个整数T(1<=T<20),表示测试组数。 每组测试输入两行,每行5个牌面,或为数值2、3、4、5、6、7、8、9、10,或为字符A,J、Q、K,其中A表示牌面值为1、其他表示牌面值为10,数据之间以一个空格分隔。

输出格式:

对于每组测试,在一行上输出一个字符串,其中,“Win”表示诺诺胜,“Lose”表示诺诺败,“Draw”表示和局。引号不必输出。

输入样例:

2
8 5 5 K 10
A 2 7 4 4
A 2 2 6 A
J 10 Q K A

输出样例:

Draw
Win
 #include 
using namespace std ;
void Init(vector& v)
{
    string ch;
    for (int i = 0; i < 5; i++)
    {
        cin >> ch;
        if (ch[0] == 'A')v[i] = 1;
        else if (ch[0] > 'A' || ch.size() == 2)
        {
            v[i] = 10;
        }
        else
            v[i] = (int)(ch[0] - '0');
    }
}

vector twoSum(vector& nums, int target,int x)
{
    unordered_map HS;//底层是哈希表
    auto it = HS.end();
    vector bo(5, 1);
    bo[x] = 0;
    for (int i = 0; i < 5; ++i)
    {
        if(bo[i])
        it = HS.find(target - nums[i]);
        if (it != HS.end())
        {
            return { it->second,i };
        }
        if(bo[i])
        HS[nums[i]] = i;
    }
    return { 0,0 };
}

int myans(vector& v1)
{
    vectortemp;
    int ans1 = 0;
    int Tans = 0;
    for (int i = 0; i < 5; i++)
    {
        Tans = 0;
        if (v1[i] == 10)
        {
            temp = twoSum(v1, 10,i);
            if (temp[1])
            {
                for (int j = 0; j < 5; j++)
                {
                    if (j != i && j != temp[0] && j != temp[1])
                    {
                        Tans += v1[j];
                    }
                }
                if (0 == Tans % 10)Tans = 10;
                else Tans %= 10;
            }
ans1 = max(ans1, Tans);
temp = twoSum(v1, 20, i);
if (temp[1])
{
    for (int j = 0; j < 5; j++)
    {
        if (j != i && j != temp[0] && j != temp[1])
        {
            Tans += v1[j];
        }
    }
    if (0 == Tans % 10)Tans = 10;
    else Tans %= 10;
}
        }
        else
        {
        temp = twoSum(v1, 10 - v1[i], i);
        if (temp[1])
        {
            for (int j = 0; j < 5; j++)
            {

                if (j != i && j != temp[0] && j != temp[1])
                {
                    Tans += v1[j];
                }
            }
            if (0 == Tans % 10)Tans = 10;
            else Tans %= 10;
        }
        ans1 = max(ans1, Tans);
        temp = twoSum(v1, 20 - v1[i], i);
        if (temp[1])
        {
            for (int j = 0; j < 5; j++)
            {
                if (j != i && j != temp[0] && j != temp[1])
                {
                    Tans += v1[j];
                }
            }
            if (0 == Tans % 10)Tans = 10;
            else Tans %= 10;
        }
        }
        ans1 = max(ans1, Tans);
    }
    return ans1;
}



int main()
{
    int T;
    cin >> T;
    for (int i = 0; i < T; i++)
    {
        vectorv1(5, 0), v2(5, 0);
        //存入数据
        Init(v1);
        Init(v2);
        //开始判断
        int ans1 = 0, ans2 = 0;//默认无牛
        ans1 = myans(v1);
        ans2 = myans(v2);
        //返回结果
        if (ans1 == ans2)cout << "Draw" << endl;
        else if (ans1 > ans2)cout << "Win" << endl;
        else  cout << "Lose" << endl;
    }
    return 0;
}

你可能感兴趣的:(c++,数据结构)