“斗牛”是一种热门的扑克游戏,每个人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;
}