枚举1-9搜索就可以了.
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
int tiles[10];
bool dfs(int curi,int melds,int eye){
if(melds==4&&eye==1)return true;
if (curi>=10||eye>1||melds>4)return false;
int i;
for (i=curi;!tiles[i];++i);
//pong
if(tiles[i]>=3){
tiles[i]-=3;
if(dfs(curi,melds+1,eye)){
tiles[i]+=3;
return true;
}
tiles[i]+=3;
}
//chow
if(i+2<=9&&tiles[i]&&tiles[i+1]&&tiles[i+2]){
tiles[i]-=1,tiles[i+1]-=1,tiles[i+2]-=1;
if(dfs(curi,melds+1,eye)){
tiles[i]+=1,tiles[i+1]+=1,tiles[i+2]+=1;
return true;
}
tiles[i]+=1,tiles[i+1]+=1,tiles[i+2]+=1;
}
//eye
if(tiles[i]>=2){
tiles[i]-=2;
if(dfs(curi,melds,eye+1)){
tiles[i]+=2;
return true;
}
tiles[i]+=2;
}
return false;
}
int main(){
int t;
while (scanf("%d",&t)==1){
memset(tiles,0,sizeof(tiles));
tiles[t]++;
for (int i=0;i<12;++i){
scanf("%d",&t);
tiles[t]++;
}
int n=0;
for (int i=1;i<=9;++i){
if(tiles[i]+1<=4){
tiles[i]++;
if(dfs(1,0,0)){
if(n++>0)printf(" ");
printf("%d",i);
}
tiles[i]--;
}
}
printf("\n");
}
return 0;
}