麻将

来源:互联网 发布:pk10免费计划软件 编辑:程序博客网 时间:2024/04/24 22:53

麻将
先枚举加入的牌,再枚举对子,最后判断剩下的牌是否合法
对于剩下的牌,先组成刻子,在和后面的组成顺子
三张一样的牌需要拆开,只有前面有单牌需要组成顺子

#include<iostream>#include<cstdio>#include<cstring>#define maxn 505using 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;}
原创粉丝点击