1. 这道题解法很有意思,忘记哪儿看到的了,希望有人告知出处

  1. 将所有出的次数用桶的存起来,
  2. i从每个数开始遍历尝试,期间嵌套j作为雀头尝试【原本自己思路没有好的方法实现,只能两重循环】
#include<bits/stdc++.h>
using namespace std;
int main(){
    int number;//牌
    int num;//听的牌
    int hu=1;
    int result=0;
    int count[11]={0,0,0,0,0,0,0,0,0,0,0};//记录每个数的张数,count[0]不用
    int temp[11];
    for(int i=0;i<13;i++){
        cin >> number;
        count[number]++;
    }
    for(num=1;num<10;num++){//依次插入10个数进行尝试
        memcpy(temp, count, sizeof(count));
        temp[num]++;//加上这张牌成为手牌
        if(temp[num]>4)//多于4张是肯定不行的
            continue;
        for(int j=1;j<10;j++){//j依次测试雀头
            memcpy(temp, count, sizeof(count));
            temp[num]++;
            if(temp[j]>=2){//只要有数目多于2,就有雀头
                temp[j]=temp[j]-2;//将雀头消去 
                hu=1;
                for(int z=1;z<10;z++){//这趟用于测试顺子和壳子
                    if(temp[z]>=3){//只要数目大于等于3,那就是刻子
                        temp[z]=temp[z]-3;
                    }
                    if(temp[z]==2&&temp[z+1]>1&&temp[z+2]>1){//刻子已去,只剩顺子
                        temp[z]=temp[z]-2;
                        temp[z+1]=temp[z+1]-2;
                        temp[z+2]=temp[z+2]-2;
                    }
                    if(temp[z]==1&&temp[z+1]>0&&temp[z+2]>0){//刻子已去,只剩顺子
                        temp[z]--;
                        temp[z+1]--;
                        temp[z+2]--;
                    }
                    if(temp[z]){//一趟下来还有剩,说明胡不了
                        hu=0;
                        break;
                    }
                }
                if(hu){
                    result++;
                    printf("%d ", num);
                }
            }
        }
    }
    if(!result)
        printf("%d",0);
    return 0;
}