hdu4431 Mahjong

来源:互联网 发布:软件到期时间破解 编辑:程序博客网 时间:2024/06/08 17:19

这道题直接考虑胡什么不太好实现,所以直接枚举34张牌,看是否能够凑成胡牌

这里需要注意一点,任意一种牌,数量不能超过四张

当时写完之后一直超时,尝试优化都失败了

其实,枚举完奖牌之后,dfs过程中若一张牌有,但是不能形成刻子或者顺子,那么这张牌肯定没有用  那么直接返回就好了,这是一个重要的优化

加了这个优化之后就可以过了  


不过后来还是直接模拟做了,时间更快,也更好写

先直接枚举顺子,不过要注意,一张牌若是三张(枚举将牌之后),就不能拆成顺子  

然后统计是否牌都用过即可

具体见代码吧,顺便贴上几组数据


//HEAD#include <cstdio>#include <ctime>#include <cstdlib>#include <cstring>#include <queue>#include <string>#include <set>#include <stack>#include <map>#include <cmath>#include <vector>#include <iostream>#include <algorithm>using namespace std;//LOOP#define FF(i, a, b) for(int i = (a); i < (b); ++i)#define FE(i, a, b) for(int i = (a); i <= (b); ++i)#define FED(i, b, a) for(int i = (b); i>= (a); --i)#define REP(i, N) for(int i = 0; i < (N); ++i)#define CLR(A,value) memset(A,value,sizeof(A))#define CPY(a, b) memcpy(a, b, sizeof(a))//STL#define SZ(V) (int)V.size()#define PB push_back#define EQ(a, b) (fabs((a) - (b)) <= 1e-10)#define ALL(c) (c).begin(), (c).end()//INPUT#define RI(n) scanf("%d", &n)#define RII(n, m) scanf("%d%d", &n, &m)#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)#define RS(s) scanf("%s", s)//OUTPUT#define WI(n) printf("%d\n", n)typedef long long LL;typedef vector <int> VI;const int INF = 100000000;const double eps = 1e-10;const int MAXN = 440;const char* mah[] = {"1m", "2m", "3m", "4m", "5m", "6m", "7m", "8m", "9m",                     "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s",                     "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p",                     "1c", "2c", "3c", "4c", "5c", "6c", "7c"};int mine[20], t[40], tt[40];bool ans[40];int get(char* s){    REP(i, 34)        if (!strcmp(mah[i], s))            return i;}bool solve(){    memcpy(tt, t, sizeof(t));    int ret = 0;    REP(i, 25)        if (i % 9 <= 6 && tt[i] && tt[i] != 3 && tt[i + 1] && tt[i + 2])        {            ret += 3;            tt[i]--, tt[i+ 1]--, tt[i + 2]--;            i--;        }    REP(i, 34)        if (tt[i] == 3)        {            ret += 3;            tt[i] -= 3;        }    if (ret == 12)        return 1;    return 0;}bool dfs1(){    REP(i, 34)        if (t[i] >= 2)        {            t[i] -= 2;            if (solve())                return 1;            t[i] += 2;        }    return 0;}bool seven(){    int ret = 0;    REP(i, 34)        if (t[i] == 2)            ret++;    if (ret == 7)        return 1;    return 0;}bool dasixi(){    int ret = 0;    if (t[0]) ret += t[0];    else return 0;    if (t[8]) ret += t[8];    else return 0;    if (t[9]) ret += t[9];    else return 0;    if (t[17]) ret += t[17];    else return 0;    if (t[18]) ret += t[18];    else return 0;    if (t[26]) ret += t[26];    else return 0;    FF(i, 27, 34)    {        if (t[i])            ret += t[i];        else            return 0;    }    if (ret == 14)        return 1;    return 0;}int main(){    int T;    char s[20];    RI(T);    while (T--)    {        CLR(ans, 0);        int ok = 0;        REP(i, 13)        {            RS(s);            mine[i] = get(s);        }        CLR(t, 0);        REP(j, 13)            t[mine[j]]++;        REP(i, 34)            if (t[i] > 4)                ok = -1;        if (ok != -1)        {            REP(i, 34)            {                CLR(t, 0);                REP(j, 13)                    t[mine[j]]++;                if (t[i] >= 4)                    continue;                t[i]++;                if (seven() || dasixi() || dfs1())                {                    ans[i] = 1;                    ok++;                }                t[i]--;            }        }        if (ok > 0)        {            printf("%d", ok);            REP(i, 34)                if (ans[i])                    printf(" %s", mah[i]);            puts("");        }        else            puts("Nooten");    }}/*201p 2p 3p 7p 8p 9p 1s 2s 3s 1c 1c 2c 2c1p 2p 3p 3p 3p 3p 4p 5p 1m 2m 3m 4m 5m1s 2s 3s 2c 2c 2c 2p 3p 5m 6m 7m 1p 1p1p 1p 2p 3p 4s 5s 6s 7c 7c 3s 3s 2m 2m1p 1p 1p 2p 2p 3p 3p 4p 4p 5p 6p 7p 8p1p 2p 3p 3p 3p 4p 5p 1m 2m 3m 4m 5m 6m1p 2p 3p 3p 3p 3p 4p 5p 1m 2m 3m 4m 5m1p 2p 3p 3p 3p 3p 4p 5p 6p 1m 2m 3m 4m1c 2c 3c 4c 5c 6c 7c 1p 9p 1m 9m 1s 9s1p 1p 3p 2p 5p 2p 6p 7p 3p 4p 5p 6p 4p1p 1p 2p 3p 2p 3p 4p 4p 5p 5p 6p 7p 7p1p 1p 9p 9p 1m 1m 9m 9m 1s 9s 1s 9s 7c1p 1p 1p 1p 1m 1m 1m 1s 9s 1c 1c 1s 9s1p 1p 1s 9s 1m 9m 1c 2c 3c 4c 5c 6c 7c2 1c 2c2 3m 6m2 1p 4pNooten6 2p 3p 5p 6p 8p 9p2 3p 6p2 3m 6m2 1m 4m13 1m 9m 1s 9s 1p 9p 1c 2c 3c 4c 5c 6c 7c3 1p 4p 7p2 3p 6p1 7cNooten1 9p*/