基於回溯的麻將最優組合分析

2021-10-07 04:58:46 字數 1251 閱讀 6577

基於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從當前結果中取出來。如果我...