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;
}