麻将
麻将
先枚举加入的牌,再枚举对子,最后判断剩下的牌是否合法
对于剩下的牌,先组成刻子,在和后面的组成顺子
三张一样的牌需要拆开,只有前面有单牌需要组成顺子
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 505
using namespace std;
int n,m;
int a[maxn],s[maxn];
int ans[maxn];
inline int read()
{
int x=0;
char ch=getchar();
while(ch<'0'&&ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }
return x;
}
bool check(int x)
{
bool flag=0;
for(int i=1;i<=n;i++){
memcpy(s,a,sizeof(s));
//for(int k=1;k<=n+2;k++) s[k]=a[k];
s[x]+=1;
flag=1;
s[i]-=2;
for(int k=1;k<=n+2;k++)
{
if(s[k]<0){ flag=0; break; }
s[k]%=3;
s[k+1]-=s[k]; s[k+2]-=s[k];
}
if(flag) return 1;
}
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
int x;
for(int i=1;i<=3*m+1;i++){
scanf("%d",&x);
a[x]++;
}
for(int i=1;i<=n;i++)
if(check(i)) ans[++ans[0]]=i;
if(!ans[0]) printf("NO\n");
else{
for(int i=1;i<=ans[0];i++)
if(i!=ans[0]) printf("%d ",ans[i]);
else printf("%d\n",ans[i]);
}
return 0;
}