hihoCoder挑战赛A题——顺子

hihoCoder挑战赛A题——顺子

题目链接:http://hihocoder.com/problemset/problem/1177

注意点

1、思路:输入四个数字分成下面几种情况:
1)有重复->不可能顺子;
2)四个数连续->有可能构成顺子(再细分:(1)1234(A看成是1)只有下一张是5才能构成顺子,所以有4种可能(暂时不考虑花色)(2)其他都有8种可能);
3)有一个跳只->可能构成顺子,有四种可能(别忘了考虑,10JQKA的情况)
4)其他的情况都不可能构成顺子

2、用set来存放输入的数据有很多好处:
1)根据长度可以看出是否有重复;
2)自动从小到大排序

3、求最大公约数的递归方法(别人提交的代码中学习的)

int gcd(int a,int b){
    if(!b) return a;
    return gcd(b,a%b);
}

可执行代码

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<set>
using namespace std;
int tran(string s)
{
    if(s=="10")
        return 10;
    else if(s=="J")
        return 11;
    else if(s=="Q")
        return 12;
    else if(s=="K")
        return 13;
    else if(s=="A")
        return 1;
    else
        return s[0]-'0';
}

void input(set<int> &num,set<char> &flower)
{
    ifstream cin("input.txt");
    string temp;
    for(int i = 0;i<4;i++)
    {
        cin>>temp;
        int len = temp.size();
        flower.insert(temp[len-1]);
        num.insert(tran(temp.substr(0,len-1)));
    }

}

int help(set<int> num)
{
    if(num.size() != 4)//有重复数字
        return 0;
    int temp = *(--num.end())-(*num.begin());
    if(temp==3)//连号
    {
        if(*num.begin()==1)//A,2,3,4的情况只有下一张为5,才能构成顺子
            return 4;
        else
            return 8;
    }
    if(temp == 4)//断号(忽略了10,J,Q,K,A的断号情况)
        return 4;

    if(*num.begin()==1 && *(++num.begin())==10)//10,J,Q,K,A差一张的情况
        return 4;
    //其余情况都不可能构成顺子
    return 0;

}
//最大公约数 greatest common divisor
int GCD(int a,int b)
{
    int i = 2;
    int result =1;
    while(i<=a&&i<=b)
    {
        if(a%i==0 && b%i==0)
        {
            a/=i;
            b/=i;
            result*=i;
        }
        else
            i++;
    }
    return result;
}
int main()
{

    set<int> num;
    set<char> flower;
    input(num,flower);
    //把A当成1,
    int res = help(num);

    if(res == 0)
    {
        cout<<"0/1";
        return 0;
    }
    //排除同花顺的情况
    if(flower.size()==1)
        res = res/4*3;

    int gcd = GCD(res,48);
    cout<<res/gcd<<"/"<<48/gcd;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值