HDU - 3391 Mahjong
题目大意:和hdu4431差不多
就是胡的方法只有hdu4431的第一种
然后sbc,scmp这些表示牌的字符不同
要注意的还有输出牌的顺序(s,b,c)
AC代码
#include<bits/stdc++.h> using namespace std; int T,n,i,j,ans,answer[1000]; string str; int have[100]; int sum[100],t; int num(string str) { int t=str[0]-'1'; if(str[1]=='s')t+=0; else if(str[1]=='b')t+=9; else if(str[1]=='c')t+=18; return t; } bool ok4X3() { int ret=0,tmp[35]; for(int i=0; i<27; i++)tmp[i]=sum[i]; for(int i=0; i<=18; i+=9) for(int j=0; j<9; j++) { if(tmp[i+j]>=3)tmp[i+j]-=3,ret++; while(j+2<9&&tmp[i+j]&&tmp[i+j+1]&&tmp[i+j+2])tmp[i+j]--,tmp[i+j+1]--,tmp[i+j+2]--,ret++; } if(ret==4)return true; return false; } bool ok1() { for(int i=0; i<27; i++) { if(sum[i]>=2) { sum[i]-=2; if(ok4X3()){sum[i]+=2;return true;} sum[i]+=2; } } return false; } bool ok() { for (int i=0;i<=26;i++)if(sum[i]>4)return false; if(ok1())return true; return false; } int main() { scanf("%d",&T); while (T--) { t++; memset(sum,0,sizeof(sum)); memset(answer,0,sizeof(answer)); ans=0; for (i=1; i<=13; i++)cin>>str,have[i]=num(str),sum[have[i]]++; for (i=0; i<=26; i++) { have[14]=i; sum[have[14]]++; if(ok()) { ans++; answer[ans]=i; } sum[have[14]]--; } printf("Case %d:",t); if(ans) { for (i=1; i<=ans; i++) { printf(" %d",(answer[i]%9)+1); if(answer[i]/9==0)printf("s"); else if(answer[i]/9==1)printf("b"); else if(answer[i]/9==2)printf("c"); } puts(""); } else puts(" None"); } return 0; }