遇到的算法题--02(斗牛)

“斗牛”是一种热门的扑克游戏,每个人5张牌,其中A当1,JQK都当10。要求:从5张牌中选出3张牌(必须刚好3张),如果存在3张牌加起来是10或者20或者30,就称为“有牛”,否则就是“没牛”。有牛的情况下,剩余两张牌加起来除以10后:
• 余数为0就是“牛牛”,是最大的一手牌。
• 如果余数为9就是“牛九”,是第二大的,依次类推,“牛一”就是最小。
• “有牛”都大于“没牛”。
• 两人都是没牛的情况下,比最大的一张牌谁大(注意A最大,2最小),最大一张牌一样则比较第二张牌,依次类推。
请写一段代码,验证两手牌哪一个最大。
输入是长度为5的两个字符串,表示两手牌。字符串内容是23456789TJQKA,注意为了让字符串长度一致,我们用T代表10。
请输出一个值:1表示第一手牌大,-1表示后一手牌更大,0表示一样大。

思路简述:解决该问题主要解决好两个问题,一个是是否有牛,第二个是剩余两个数在有牛情况下的余数,然后根据需要判断各种情况即可。此外,因为在没有牛的情况下,采用比较余数大小的方式

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int partition(vector<int>& arr,int start, int send){
    int s = start;
    int e = send;
    int temp = arr[send];
    while(s < e){
        while(s < e && arr[s] <= temp){
            s++;
        }
        if(s < e){
            arr[e] = arr[s];
        }

        while(s < e && arr[e] >= temp){
            e--;
        }
        if(s < e){
            arr[s] = arr[e];
        }
    }
    arr[send] = temp;
    return s;
}

void quick_sort(vector<int>& arr,int start,int send)
{
    if(arr.size() <= 0)
        return;
    if(start >= send)
        return;

    //枢纽
    int index = partition(arr,start,send);
    quick_sort(arr,start,index-1);
    quick_sort(arr,index+1,send);
}

vector<int> format2integer(const string& s){
    vector<int> result;
    for(int i = 0;i < s.length();i++){
        if(s[i] >= '2' && s[i] <= '9'){
            result.push_back(s[i] - '0');
        }else if(s[i] == 'A'){
            result.push_back(1);
        }else if(s[i] == 'T' || s[i] == 'J' || s[i] == 'Q' || s[i] == 'K'){
            result.push_back(10);
        }
    }
    //排序,方便后续无牛情况的比较
    quick_sort(result,0,result.size()-1);
    return result;
}

void check_result(const vector<int>& s,int* is_bull,int* yushu){
    int result = 0;
    int sum_for_three = 0;
    int sum_for_five = 0;
    //计算是否存在牛
    for(int i = 0;i < s.size(); i++){
        for(int j = i+1;j < s.size();j++){
            for(int k = j+1;k < s.size(); k++){
                int temp = s[i] + s[j] + s[k];
                if(temp - 10 == 0 || temp - 20 == 0 || temp - 30 == 0){
                    *is_bull = 1;
                    sum_for_three = temp;
                    cout<<"bull: "<<s[i]<<" "<<s[j]<<" "<<s[k]<<endl;
                    break;
                }
            }
        }
    }

    for(int i=0; i < s.size(); i++){
        sum_for_five += s[i];
    }
    //计算剩余两个数的和除以10之后的余数
    if(*is_bull == 1){
        *yushu = (sum_for_five - sum_for_three)%10;
    }else{
        *yushu = -1;
    }
    cout<<"yushu: "<<*yushu<<endl;
}

void printf(vector<int>& n){
    for(int i=0;i<n.size();i++){
        cout<<n[i]<<'\t';
    }
    cout<<endl;
}

int check_method(const string& a,const string& b){
    //长度检查
    if(a.length() <= 0 && b.length() <= 0){
        return 0;
    }else if(a.length() <= 0){
        return -1;
    }else if(b.length() <= 0){
        return 1;
    }

    //把字符串格式化为整形以方便比较
    vector<int> a_integer = format2integer(a);
    vector<int> b_integer = format2integer(b);

    //是否有牛
    int is_a_bull = 0,is_b_bull =  0;

    //余数
    int a_yushu = 0, b_yushu = 0;

    //检查是否有牛,同时获取剩余两个数除10的余数
    check_result(a_integer,&is_a_bull,&a_yushu);
    printf(a_integer);
    cout<<is_a_bull<<" "<<a_yushu<<endl;
    check_result(b_integer,&is_b_bull,&b_yushu);
    printf(b_integer);
    cout<<is_b_bull<<" "<<b_yushu<<endl;

    //有牛和无牛的检验
    if(is_a_bull == 1 && is_b_bull != 1){
        return 1;
    }else if(is_a_bull != 1 && is_b_bull == 1){
        return -1;
    }
    //都无牛的情况
    if(is_a_bull != 1 && is_b_bull != 1){
        int i=0,j=0;
        while(i < a_integer.size() && j < b_integer.size()){
            if(a_integer[i] == b_integer[j]){
                i++;
                j++;
            }else if(a_integer[i] > b_integer[j]){
                return 1;
            }else {
                return -1;
            }
        }
    }

    //都有牛的情况
    if(a_yushu == b_yushu){
        return 0;
    }else if(a_yushu > b_yushu){
        return 1;
    }else {
        return -1;
    }
}

int main()
{
    string a=string("4579K");
    string b=string("AAAA2");
    cout<<check_method(a,b)<<endl;
    return 0;
}
 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值