zoukankan      html  css  js  c++  java
  • HDU

    中华文化真是博大精深

    这两天的Dark模拟题做的我要吐了

    题目大意:给你13张麻将,求再加上哪张可以胡

    胡的要求有三个

    1、一个对子 +  4组 3个相同的牌或者顺子。  只有m、s、p是可以构成顺子的。东西南北这样的牌没有顺子。
    2、7个不同的对子。
    3、1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c.  这13种牌每种都有,而且仅有这13种牌。肯定是有一种2张。其他的1张。
    具体思路:枚举加那张牌,然后按题意模拟,判断是否胡了即可
    我貌似wa了一页的样子,原因是没有特判某种牌>4张的情况(由于只有4副,所以某种牌>4张的情况不合法)
    AC代码
    #include<bits/stdc++.h>
    using namespace std;
    int T,n,i,j,ans,answer[1000];
    string str;
    int have[100];
    int sum[100];
    int num(string str)
    {
        int t=str[0]-'1';
        if(str[1]=='m')t+=0;
        else if(str[1]=='s')t+=9;
        else if(str[1]=='p')t+=18;
        else t+=27;
        return t;
    }
    bool ok4X3()
    {
        int ret=0,tmp[35];
        for(int i=0; i<34; i++)tmp[i]=sum[i];
        for(int i=0; i<=18; i+=9)
            for(int j=0; j<9; j++)
            {
                if(tmp[i+j]>=3)tmp[i+j]-=3,ret++;
                while(j+2<9&&tmp[i+j]&&tmp[i+j+1]&&tmp[i+j+2])tmp[i+j]--,tmp[i+j+1]--,tmp[i+j+2]--,ret++;
            }
        for(int j=0; j<7; j++)if(tmp[27+j]>=3)tmp[27+j]-=3,ret++;
        if(ret==4)return true;
        return false;
    }
    bool ok1()
    {
        for(int i=0; i<34; i++)
        {
            if(sum[i]>=2)
            {
                sum[i]-=2;
                if(ok4X3()){sum[i]+=2;return true;}
                sum[i]+=2;
            }
        }
        return false;
    }
    bool ok2()
    {
        for(int i=0; i<34; i++)if(sum[i]!=2&&(sum[i]!=0))return false;
        return true;
    }
    bool ok3()
    {
        for(int j=0; j<7; j++)if(sum[j+27]==0)return false;
        for(int i=0; i<=18; i+=9)
        {
            if(sum[i]==0||sum[i+8]==0)return false;
            for(int j=1; j<8; j++)
                if(sum[i+j]!=0)return false;
        }
        return true;
    }
    
    bool ok()
    {
        for (int i=0;i<=33;i++)if(sum[i]>4)return false;
        if(ok1()||ok2()||ok3())return true;
        return false;
    }
    int main()
    {
        scanf("%d",&T);
        while (T--)
        {
            memset(sum,0,sizeof(sum));
            memset(answer,0,sizeof(answer));
            ans=0;
            for (i=1; i<=13; i++)cin>>str,have[i]=num(str),sum[have[i]]++;
            for (i=0; i<=33; i++)
            {
                have[14]=i;
                sum[have[14]]++;
                if(ok())
                {
                    ans++;
                    answer[ans]=i;
                }
                sum[have[14]]--;
            }
            if(ans)
            {
                printf("%d",ans);
                for (i=1; i<=ans; i++)
                {
                    printf(" %d",(answer[i]%9)+1);
                    if(answer[i]/9==0)printf("m");
                    else if(answer[i]/9==1)printf("s");
                    else if(answer[i]/9==2)printf("p");
                    else printf("c");
                }
                puts("");
            }
            else puts("Nooten");
        }
        return 0;
    }
  • 相关阅读:
    关于近期
    Tips on Importons and Irradiance Particles in mental ray
    给她的歌
    Fatal In Code Generation Of Visual C++
    kdtree vs octree
    疯子的胜利——记6.18毕业晚会
    转凉
    事件与委托的匿名方法使用方法示例
    VS2008使用技巧
    硬链接和软连接的区别
  • 原文地址:https://www.cnblogs.com/Orange-User/p/7794954.html
Copyright © 2011-2022 走看看