题目链接:https://nanti.jisuanke.com/t/39612
题解:枚举每一张牌,然后再枚举每一个对子,判断的时候,按顺序,若数量大于等于3个,就按刻子算,否则就按顺子算
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int a[12],b[12],c[12],d[12];
int aa[12],bb[12],cc[12],dd[12];
int solve()
{
for(int i=1;i<=9;i++)
{
aa[i]=a[i];
bb[i]=b[i];
cc[i]=c[i];
dd[i]=d[i];
}
int flag=0;
for(int i=1;i<=7;i++)
{
if(aa[i]<0) return 0;
if(aa[i]>=3) aa[i]-=3;
if(aa[i]) aa[i]--,aa[i+1]--,aa[i+2]--;
if(aa[i]) aa[i]--,aa[i+1]--,aa[i+2]--;
}
if(aa[8]!=0 && aa[8]!=3) return 0;
if(aa[9]!=0 && aa[9]!=3) return 0;
for(int i=1;i<=7;i++)
{
if(bb[i]<0) return 0;
if(bb[i]>=3) bb[i]-=3;
if(bb[i]) bb[i]--,bb[i+1]--,bb[i+2]--;
if(bb[i]) bb[i]--,bb[i+1]--,bb[i+2]--;
}
if(bb[8]!=0 && bb[8]!=3) return 0;
if(bb[9]!=0 && bb[9]!=3) return 0;
for(int i=1;i<=7;i++)
{
if(cc[i]<0) return 0;
if(cc[i]>=3) cc[i]-=3;
if(cc[i]) cc[i]--,cc[i+1]--,cc[i+2]--;
if(cc[i]) cc[i]--,cc[i+1]--,cc[i+2]--;
}
if(cc[8]!=0 && cc[8]!=3) return 0;
if(cc[9]!=0 && cc[9]!=3) return 0;
for(int i=1;i<=7;i++)
{
if(dd[i]==0 || dd[i]==3) continue;
return 0;
}
return 1;
}
int judge()
{
int flag=0;
for(int i=1;i<=9&&!flag;i++)
{
if(a[i]>=2)
{
a[i]-=2;
if(solve())flag=1;
a[i]+=2;
}
}
for(int i=1;i<=9&&!flag;i++)
{
if(b[i]>=2)
{
b[i]-=2;
if(solve())flag=1;
b[i]+=2;
}
}
for(int i=1;i<=9&&!flag;i++)
{
if(c[i]>=2)
{
c[i]-=2;
if(solve())flag=1;
c[i]+=2;
}
}
for(int i=1;i<=7&&!flag;i++)
{
if(d[i]>=2)
{
// cout<<i<<endl;
d[i]-=2;
if(solve())flag=1;
d[i]+=2;
}
}
// cout<<flag<<endl;
return flag;
}
int main()
{
char op[3];
while(~scanf("%s",op))
{
for(int i=1;i<=10;i++) a[i]=b[i]=c[i]=d[i]=0;
if(op[1]=='m')
{
a[op[0]-'0']++;
}
if(op[1]=='s')
{
b[op[0]-'0']++;
}
if(op[1]=='p')
{
c[op[0]-'0']++;
}
if(op[1]=='z')
{
// cout<<op[0]-'0'<<endl;
d[op[0]-'0']++;
}
for(int i=1;i<=12;i++)
{
scanf("%s",op);
// cout<<op<<endl;
if(op[1]=='m')
{
a[op[0]-'0']++;
}
if(op[1]=='s')
{
b[op[0]-'0']++;
}
if(op[1]=='p')
{
c[op[0]-'0']++;
}
if(op[1]=='z')
{
// cout<<op[0]-'0'<<endl;
d[op[0]-'0']++;
}
}
for(int i=1;i<=9;i++)
{
if(a[i]==4) continue;
a[i]++;
if(judge()) printf("%dm\n",i);
a[i]--;
}
for(int i=1;i<=9;i++)
{
if(b[i]==4) continue;
b[i]++;
if(judge()) printf("%ds\n",i);
b[i]--;
}
for(int i=1;i<=9;i++)
{
if(c[i]==4) continue;
c[i]++;
if(judge()) printf("%dp\n",i);
c[i]--;
}
for(int i=1;i<=7;i++)
{
if(d[i]==4) continue;
d[i]++;
if(judge()) printf("%dz\n",i);
d[i]--;
}
}
// cout<<1<<endl;
return 0;
}