代码:
#include<bits/stdc++.h> using namespace std; int num[40],num2[40]; bool check1(){//判断去掉雀门后是否胡牌 for(int i=1;i<=9;i++){ if(num2[i]%3){ int x=num2[i]%3; if(i+2<=9&&num2[i+1]>=x&&num2[i+2]>=x){ num2[i]-=x; num2[i+1]-=x; num2[i+2]-=x; }else{ return 0; } } } for(int i=10;i<=18;i++){ if(num2[i]%3){ int x=num2[i]%3; if(i+2<=18&&num2[i+1]>=x&&num2[i+2]>=x){ num2[i]-=x; num2[i+1]-=x; num2[i+2]-=x; }else{ return 0; } } } for(int i=19;i<=27;i++){ if(num2[i]%3){ int x=num2[i]%3; if(i+2<=27&&num2[i+1]>=x&&num2[i+2]>=x){ num2[i]-=x; num2[i+1]-=x; num2[i+2]-=x; }else{ return 0; } } } for(int i=28;i<=34;i++){ if(num2[i]%3){ return 0; } } return 1; } bool check(){//判断是否胡牌 for(int i=1;i<=34;i++){ if(num[i]>=2){ for(int j=1;j<=34;j++){ num2[j]=num[j]; } num2[i]-=2; if(check1()){//胡牌 return 1; } } } return 0; } int cnt=0; string name(int i){ string s; if(i<=9){ s+='0'+i; s+='w'; }else{ if(i<=18){ s+='0'+i-9; s+='b'; }else{ if(i<=27){ s+='0'+i-18; s+='s'; }else{ s+='0'+i-27; s+='z'; } } } return s; } int main(){ int n; cin>>n; while(n--){ memset(num,0,sizeof(num)); string s; cin>>s; for(int i=0;i<28;i+=2){ if(s[i+1]=='w'){ num[s[i]-'0']++; } if(s[i+1]=='b'){ num[s[i]-'0'+9]++; } if(s[i+1]=='s'){ num[s[i]-'0'+18]++; } if(s[i+1]=='z'){ num[s[i]-'0'+27]++; } } //for(int i=1;i<=34;i++){ // cout<<num[i]<<endl; //} if(check()){ cout<<"Tsumo!"<<endl; continue; } int cnt=0; vector<int> ans[15]; for(int i=1;i<=34;i++){ if(num[i]){ bool flag=0; num[i]--; for(int j=1;j<=34;j++){ num[j]++; if(check()){ flag=1; ans[cnt].push_back(j); } num[j]--; } if(flag){ ans[cnt].push_back(i); cnt++; } num[i]++; } } cout<<cnt<<endl; for(int i=0;i<cnt;i++){ cout<<name(ans[i][ans[i].size()-1])<<' '; for(int j=0;j<ans[i].size()-1;j++) cout<<name(ans[i][j]); cout<<endl; } } }