Chinese Mahjong UVA - 11210 (DFS)

先记录下每一种麻将出现的次数,然后枚举每一种可能得到的麻将,对于这个新的麻将牌,去判断可不可能胡,如果可以胡,就可以把这张牌输出出来。

因为eye只能有一张,所以这个是最好枚举的,就枚举每张牌成为eye的可能,然后对于剩下的牌去判断成为pong和chow的可能,然后判断可不可能胡牌

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x))
#define INOPEM freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout)

typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 2e6+5;
const int maxm = 1005000;
const int mod = 1e9+7;
using namespace std;

int n, m;
int T, tol;
char *Mahjong[39] = {
    "0", "1T", "2T", "3T", "4T", "5T", "6T", "7T", "8T", "9T",
    "0", "1S", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S",
    "0", "1W", "2W", "3W", "4W", "5W", "6W", "7W", "8W", "9W", //29
    "0", "DONG", "NAN", "XI", "BEI",
    "0", "ZHONG", "FA", "BAI"//38
};
int cnt[40];
int id[15];

void init() {
    memset(cnt, 0, sizeof cnt);
}

int find(char *s) {
    for(int i=0; i<40; i++)
        if(strcmp(s, Mahjong[i]) == 0)
            return i;
}

bool dfs(int count) {
    if(count == 14)    return true;
    for(int i=1; i<=39; i++) {
        if(cnt[i] >= 3) {
            cnt[i] -= 3;
            if(dfs(count+3))    return true;
            cnt[i] += 3;
        }
    }
    for(int i=1; i<=29; i++) {
        if(cnt[i] >= 1 && cnt[i+1] >= 1 && cnt[i+2] >= 1) {
            cnt[i] -= 1, cnt[i+1] -= 1, cnt[i+2] -= 1;
            if(dfs(count+3))    return true;
            cnt[i] += 1, cnt[i+1] += 1, cnt[i+2] += 1;
        }
    }
    return false;
}

bool judge() {
    for(int i=1; i<=39; i++) {
        if(cnt[i] >= 2) {
            cnt[i] -= 2;
            if(dfs(2))    return true;
            cnt[i] += 2;
        }
    }
    return false;
}

int main() {
    char tmp[10];
    int cas = 1;
    while(scanf("%s", tmp)) {
        if(tmp[0] == '0')    break;
        init();
        id[1] = find(tmp);
        for(int i=2; i<=13; i++) {
            scanf("%s", tmp);
            id[i] = find(tmp);
        }
        printf("Case %d:", cas++);
        bool flag = false;
        for(int i=0; i<=38; i++) {
            if(Mahjong[i][0] == '0')    continue;
            memset(cnt, 0, sizeof cnt);
            for(int j=1; j<=13; j++)    cnt[id[j]]++;
            if(cnt[i] >= 4)    continue;
            cnt[i]++;
            if(judge()) {
                flag = true;
                printf(" %s", Mahjong[i]);
            }
        }
        if(!flag)    printf(" Not ready");
        printf("\n");
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/9525812.html

Mahjong Helper是一款配合Majsoul麻将游戏的辅助工具。Majsoul是一款非常受欢迎的多人在线麻将游戏,具有丰富的玩法和规则。Mahjong Helper通过提供一系列的实用功能来提升玩家在游戏中的竞争力。 Mahjong Helper的功能非常强大,具体包括以下几方面。首先,它能提供牌效率的计算,即根据当前手牌的情况和牌墙的剩余牌数,分析出打出一张牌后的期望牌墙变化,有助于玩家决策出最合适的打牌策略。其次,它能根据对手的出牌和玩家的手牌,判断对手的可能手牌,为玩家提供参考,帮助玩家更好地防守和攻击。此外,Mahjong Helper还能提供暗刻、杠牌和和牌的概率计算,帮助玩家更好地预判局势和做出决策。 Mahjong Helper的使用非常简单方便。只需要在Majsoul游戏过程中运行该工具,它会根据游戏进行动态显示当前局势的分析结果。玩家可以根据这些信息进行决策,提高自己的胜率和竞争力。同时,Mahjong Helper的数据分析和计算能力非常高效准确,能够为玩家提供真实可靠的参考,提升玩家的游戏体验。 总而言之,Mahjong Helper是一款非常实用的麻将辅助工具,与Majsoul游戏完美结合,为玩家提供强大的辅助功能,帮助玩家提升胜率和竞争力。无论是对于刚入门的新手还是对于有一定经验的老手,Mahjong Helper都能为他们带来更好的游戏体验和更高的游戏成就。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值