跑得快算法
2021.02.27
var CardValueMap = map[int]int{
POKER_EMPTY: -1,
2: 0,
3: 1,
4: 2,
5: 3,
6: 4,
7: 5,
8: 6,
9: 7,
10: 8,
11: 9,
12: 10,
0: 11,
1: 12
}
// 跑得快,底层数据结构
0 1 2 3 4 5 6 7 8 9 10 11 12 //方片
13 14 15 16 17 18 19 20 21 22 23 24 25 //梅花
26 27 28 29 30 31 32 33 34 35 36 37 38 //红桃
39 40 41 42 43 44 45 46 47 48 49 50 51 //黑桃
52 53 //小王,大王
card % 13 取模计算得出 牌值切片的索引值
card % 13 + 1 计算得出牌值
根据card值区分花色
使用链表生成树,实现牌型算法:
A
=========
| |
K K
=========
| |
Q Q
=========
| |
J J
=========
| |
10 10 //实现并非使用二叉树
root
=====================================================================
| |
================================================================================================== ========= ...依次类推
| | | | | | | | | | | | | | |
3 4 5 6 7 8 9 10 J Q K A 2 33 --- 22
========= ...依次类推 ========= ...依次类推
| | | |
4 --- 2 44 --- 22
=========
| | …依次类推
5 — 2
…依次类推
构建出牌树:
1.先排除炸弹
2.从最小牌开始 (递增逐个判断)
A 一张
a.A 找到所有单牌
b.ABCDE 使用所有单牌构建顺子 (从最小单张开始 递增逐个判断)
c.AAAB 找到所有的3张,构建三带一 (从最小3张开始 递增逐个判断)
d.AAABBBCD 使用所有的3张构建飞机带单牌 (从最长的开始)
B 两张
a.AA 找到所有对子
b.AABB 使用所有对子构建顺子
c.AAABB 找到所有的3张,构建三带二
d.AAABBBCCDD使用所有的3张构建飞机带对牌
C 三张
a.AAABB 找到所有的3张,构建三带二
b.AAABBB 使用所有的三张构建飞机
c.AAABBBCCDD 使用所有的3张构建飞机带对牌
D 四张
a.AAAA 找到所有的4张
超时自动出牌:
AutoShowCard
getAutoShowCard
首出牌:getBestAutoSuggestCards, 首出最长的牌, 剩余3张和下家报单特殊处理
压牌:getAutoSuggestFunc 首先判断炸弹出牌顺序,相同牌型先出,其次拆牌出,其次出炸弹
计算树的深度,找出最短的子树:
计算树的最小深度
分析所有叶子节点
计算叶子结点到根节点的路径长度,长度等于最小深度 。即是最短的子树。
计算排序中单牌数量最少的链表
链表排序 按照牌型中最大的牌值