3928 - 斗地主
时间限制 : 1 秒
内存限制 : 128 MB
规则:
单张:直接出一张牌 如:3
对子:出两张一样的牌 如:33
3张:出3张一样的牌,可以带一张或者一对任意的牌, 如: 333或3334或33344
顺子:5张大小连续的牌(2不参与顺子) 如:3456789TJQKA
连对:3对大小连续的牌(2不参与) 如:QQKKAA
飞机:2个大小连续的3张(2不参与) 如:KKKAAA或KKKAAA56或KKKAAA5566(KKKAAA5不允许)
炸弹:4张一模一样的牌可带两张任意的牌 如: 3333或333345或33334455
题目输入
一个T表示T组数据 每组数据输入一个字符串表示手牌 字符串长度L<=20
题目输出
输出这个回合能有多少种出牌方法
输入/输出样例
输入格式
3 AA AAA5 T2KK5J6449J7T35657625K26TA2ATQ
输出格式
2 5 357
C++解答
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int sum[15]; int n; int res=0; void one() { for(int i=1;i<=13;i++) { if(sum[i]>=1) { res++; } } } void dui() { for(int i=1;i<=13;i++) { if(sum[i]>=2) { res++; } } } void three() { for(int i=1;i<=13;i++) { if(sum[i]>=3) { sum[i]-=3; res++; for(int j=1;j<=13;j++) { if(sum[j]>=2) res++; if(sum[j]>=1) res++; } sum[i]+=3; } } } void sz() { int res1=1; for(int i=1;i<=8;i++) { if(sum[i]>=1) { if(res1==1) { res1=1; for(int j=i+1;j<=12;j++) { if(sum[j]>=1) { res1++; } else break; } } else res1--; if(res1>=5) { for(int j=4;j<res1;j++) { res++; } } } } } void ld() { int res1=1; for(int i=1;i<=10;i++) { if(sum[i]>=2) { if(res1==1) { res1=1; for(int j=i+1;j<=12;j++) { if(sum[j]>=2) res1++; else break; } } else res1--; if(res1>=3) { for(int j=2;j<res1;j++) { res++; } } } } } void fjone(int s,int temp) { if(s==0) { res++; return ; } for(int i=temp;i<=13;i++) { if(sum[i]>=1) { sum[i]--; fjone(s-1,i); sum[i]++; } } } void fjtwo(int s,int temp) { if(s==0) { res++; return ; } for(int i=temp;i<=13;i++) { if(sum[i]>=2) { sum[i]-=2; fjtwo(s-1,i); sum[i]+=2; } } } void fj() { int res1=1; for(int i=1;i<=11;i++) { if(sum[i]>=3) { if(res1==1) { res1=1; for(int j=i+1;j<=12;j++) { if(sum[j]>=3) res1++; else break; } } else res1--; if(res1>=2) { sum[i]-=3; for(int j=1;j<res1;j++) { sum[i+j]-=3; res++; fjone(j+1,1); fjtwo(j+1,1); } for(int j=i;j<i+res1;j++) sum[j]+=3; } } } } void zd() { for(int i=1;i<=13;i++) { if(sum[i]==4) { sum[i]-=4; res++; fjtwo(2,1); sum[i]+=4; } } } void solve() { dui(); three(); one(); sz(); ld(); fj(); zd(); } char s[105]; int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int t; scanf("%d",&t); while(t--) { memset(sum,0,sizeof(sum)); scanf("%s",s); int len=strlen(s); for(int i=0;i<len;i++) { if(s[i]>='3'&&s[i]<='9') sum[s[i]-'3'+1]++; else if(s[i]=='2') sum[13]++; else if(s[i]=='A') sum[12]++; else if(s[i]=='K') sum[11]++; else if(s[i]=='Q') sum[10]++; else if(s[i]=='J') sum[9]++; else if(s[i]=='T') sum[8]++; } res=0; solve(); printf("%d\n",res); } }