2021昆明站K-Riichi!!(麻将)

代码:

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

}
原文地址:https://www.cnblogs.com/xuanzo/p/14645324.html