hdu - 4431 - Mahjong - 模擬

就是給了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張。


首先是枚舉18+7=34張牌,加進去構成14張牌,判斷胡牌。
胡牌判斷如下。
對於第一種情況:枚舉每一個對子。然後按照順序找3張相同或者順子。如果有三種相同的,構成3張相同的。沒有就看能不能和後面的構成順子。一定要按照順序從小到大找過去。 1c```7c只能構成3張一樣的。然後判斷是不是剛好找到4組。
對於第二種情況:就是要每一種牌的數量要麼是0,要麼是2,這樣一定是7個不同的對子了。

對於第三種情況:就是要讓這13種牌的數量不等於0,而且其他牌的數量爲0;

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int T, ans[300], sub, p[100], v[100];
char c, str[10];
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 ver[20] = {
    0,8,9,17,18,26,27,28,29,30,31,32,33
};
int convert(char * s){
    for(int i = 0; i < 34; i ++){
        if(strcmp(s,mah[i]) == 0)
            return i;
    }return -1;
}
// return false
bool three(int x){
    int ret = 0;
    int tmp[35] ;
    for(int i = 0; i < 34; i ++) tmp[i] = p[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 realcheck(){
    for(int i = 0; i < 34; i ++){
        if(p[i] >= 2){
            p[i] -= 2;
            if(three(0)){
                p[i] += 2;
                return true;
            }p[i] += 2;
        }
    }
    return false;
}
bool eyes(){
    for(int i = 0; i < 34; i ++){
        if(p[i] != 2 && p[i] != 0)
            return false;
    }
    return true;
}
bool spe(){
    for(int j = 0; j < 7; j ++)
        if(p[j + 27] == 0)
            return false;
    for(int i = 0; i <= 18; i += 9){
        if(p[i] == 0 || p[i + 8] == 0) return false;
        for(int j = 1; j < 8; j ++){
            if(p[i + j] != 0)
                return false;
        }
    }
    return true;
}
bool judge(){
    if(realcheck() || eyes() || spe()){
        return true;
    }return false;
}
int main(){
    scanf("%d", & T);
    while(T --){
        for(int i = 0; i < 13; i ++){
            scanf("%s", str);
            v[i] = convert(str);
        }
        memset(p, 0, sizeof(p));
        for(int i = 0; i < 13; i ++){
            p[v[i]] ++;
        }
        sub = 0;

        for(int i = 0; i < 34; i ++){
            if(p[i] < 4){
                p[i] ++;
                if(judge()){
                    ans[sub ++] = i;
                }
                p[i] --;
            }
        }
        if(sub >= 1){
            printf("%d", sub);
            for(int i = 0; i < sub; i ++){
                printf(" %s", mah[ans[i]]);
            }printf("\n");
        }else{
            printf("Nooten\n");
        }

    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章