基於go寫的麻將牌型分析,可用於判胡,出牌。在麻將中234這樣的叫順子,222這樣的叫刻子,22這樣的叫將。不考慮特殊牌型,麻將的胡牌公式可以表示成m3 + n3 + 2*1,m、n大於等於0,分別表示順子的數量和刻子的數量。
以出牌為例,當我們摸一張牌的時候該打哪張,是由牌型分數決定的。
分析還存在一些問題,由優化的空間,先占個坑。
//麻將對照表,僅作為參考,不參與計算
var g_cards =
byte
,/* 筒 */
,/* 條 */
,/* 萬 */
,/* 東南西北中發白 */
}
分析手上的牌,以順子、刻子、將…這樣的形式儲存。
type tiletype struct
按照順序提取,先提取順子、還是刻子?提取出來之後第二次是提取順子,還是刻子?對最終的結果都會有影響。所以,用回溯法分析所有的組合,找出最好的組合,由於是以分數作為map的key,所以會存在覆蓋的問題,但我們只需要得到分數最大的那個分析順序,所以不影響。
tiles :=
byte
,//數字表示對應的牌的張數,,
,}//分析所有可能的組合(分數相同的組合會覆蓋,但無所謂,只要返回乙個就夠了),得到解析步驟
func
(tt * tiletype)
getanastep
(tiles [
]byte
, b [
]byte
, isgetj bool
)var tiles0 [
]byte
var tiles1 [
]byte
var tiles2 [
]byte
tt.ret[0]
, tiles0 =
getones
(temps)
//提取一組順子
if tt.ret[0]
tt.ret[1]
, tiles1 =
getonek
(tempk)
//提取一組刻子
if tt.ret[1]
tt.ret[2]
, tiles2 =
getonej
(tempj)
//提取一對將
if tt.ret[2]
&& isgetj
}
基於組合的分田地
題目描述 洋洋和15個朋友來玩打土豪分田地的遊戲,洋洋決定讓你來分田地,地主的田地可以看成是乙個矩形,每個位置有乙個價值,分割田地的方法是橫豎各切三刀,分成16份,作為領導幹部,洋洋總是會選擇其中價值最小的乙份田地,作為洋洋最好的朋友,你希望洋洋取得的田地價值和盡可能大,你知道這個值最大可以是多少嗎...
組合的輸出(回溯 dfs)
排列與組合是常用的數學方法,其中組合就是從n個元素中抽出r個元素 不分順序且r n 我們可以簡單地將n個元素理解為自然數1,2,n,從中任取r個數。現要求你不用遞迴的方法輸出所有組合。例如n 5,r 3,所有組合為 l 2 3 l 2 4 1 2 5 l 3 4 l 3 5 1 4 5 2 3 4 ...
回溯演算法之組合的和
回溯法的基本思想是按照輸入陣列的順序,每一層遞迴處理乙個元素,當處理到最後一層的時候,也就是把陣列中的所有元素都處理完的時候,把當前結果加入到最後的返回結果中。值得注意的是,每次在遞迴到下一層之前,我們加入了某個要處理的元素x,在下一層遞迴返回之後,我們要把之前加入的元素x從當前結果中取出來。如果我...