麻将

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

#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;
}
posted @ 2017-10-14 06:28  HunterxHunterl  阅读(119)  评论(0编辑  收藏  举报