美文网首页
算法题:麻将判胡

算法题:麻将判胡

作者: 杰哥长得帅 | 来源:发表于2019-02-01 17:03 被阅读4次

如题,没有字牌,不考虑牌种
input: a[14] , 整数,1 <= ai <= 9,
output: boolean,true,false,是否胡牌

胡牌条件:2 + 4 * 3
1 * 2:雀头,(i,i)
4 * 3:面子
刻子:(i,i,i)
顺子:(i,i+1,i+2)
0 <= ci <= 4,ci 表示 i 的数量

a[14] = 11234234345666,T
a[14] = 12323445567892,F

1、搜索 + 回溯
枚举雀头,剩下的暴力搜索

    boolean canHu(int a[]) {
        int[] num = new int[10];
        for (int i = 0; i < a.length; i ++)
            num[a[i]] ++;
        for (int i = 0; i < 10; i ++) {
            if (a[i] >= 2) {
                num[a[i]] -= 2;
                if (canMatch(num)) return true;
                num[a[i]] += 2;
            }
        }
        return false;
    }
    
    boolean canMatch(int num[]) {
        boolean flag = false;
        for (int i = 1; i < 10; i ++) {
            if (num[i] > 0) {
                flag = true;
                break;
            }
        }
        if (!flag) return true;
        for (int i = 1; i < 10; i ++) {
            if (num[i] > 0) {
                if (num[i] >= 3) {
                    num[i] -= 3;
                    if (canMatch(num)) return true;
                    num[i] += 3;
                }
                if (i + 2 < 10 && num[i + 1] > 0 && num[i + 2] > 0) {
                    num[i] -= 1; num[i + 1] -= 1; num[i + 2] -= 1;
                    if (canMatch(num)) return true;
                    num[i] += 1; num[i + 1] += 1; num[i + 2] += 1;
                }
            }
        }
        return false;
    }

2、贪心
同样先枚举雀头,剩下的牌排序,然后从最小的开始考虑,如果该号码的牌数小于 3,则必须是顺子;否则可以贪心地认为是刻子,因为如果当成顺子,则要消耗掉后面连续的两对刻子(这和连续消耗三对刻子是一样的),这样的话可能会影响后面的顺子。所以同号码牌数不小于 3 的情况下,优先消耗刻子

相关文章

  • 算法题:麻将判胡

    如题,没有字牌,不考虑牌种input: a[14] , 整数,1 <= ai <= 9,output: boole...

  • 性能最高的麻将算法 -- lua

    关于这个算法的由来 今天是在公司写麻将算法的第四天,在第二天的时候已基本实现带N个癞子的麻将判胡算法,但是,性能太...

  • 麻将胡牌算法

    犹豫工作和自己学习了一些新的东西,今天打开博客吓自己一跳,原来自己这么久没有更新博客了。看来以后还是要坚持每周最少...

  • C语言单纯的模拟麻将胡牌算法!简单分析,不喜莫入

    麻将胡牌算法 不带赖子,14张牌,以筒子为例子,不考虑杂交系列,纯属探索性算法,并非完整麻将算法,请勿存在误区。单...

  • 高性能麻将胡算算法(回溯+剪枝)

    麻将的胡牌算法算麻将中最主要的一个算法,这里说的算法是一个O(1)的算法,当然是用空间换时间了,如果我们可以把每个...

  • 判断最小生成树是否唯一 POJ --- 1679

    网上两种算法对应都有:题目链接 prim算法判最小生成树是否唯一 下面是这道题的AC代码: kruskal的算法,...

  • 原创干货!麻将平胡算法

    此算法基本可以通用于所有麻将的平胡规则,即满足m * ABC + n * AAA + AA(其中m、n可为0)的胡...

  • 判环算法以及链表常见算法题

    由于涉及到Floyd判环算法,故先简单阐述一下Floyd判环算法原理。Floyd判环算法算法原理:设置两个指针同时...

  • 麻将胡牌

    题目:雀魂启动 简述:根据输入(一个数组),判断抽取什么牌可以胡牌,前提是满足麻将的规则,一对眼+4对顺子(比如1...

  • 高性能麻将AI算法

    想要一个高性能的麻将AI算法,这个问题我们拆解成2个子集来思考,“高性能”,“麻将AI算法”,我们先针对麻将AI算...

网友评论

      本文标题:算法题:麻将判胡

      本文链接:https://www.haomeiwen.com/subject/apkcsqtx.html