最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

日麻向聽數(shù)計算

2023-02-21 01:36 作者:ミノリ  | 我要投稿

兩年前對日麻比較狂熱的時候自己整理的筆記了,現(xiàn)在已經(jīng)很久沒碰日麻了。整理自己電腦上資料的時候看到了這個,就發(fā)出來吧。筆記可能寫的也不完整,也不打算再補充什么了。



手牌向聽數(shù)計算

一、加算法

手牌最少還需要摸到多少張有效牌才能聽牌,這個牌數(shù)就是向聽數(shù)。

?

二、減算法(http://www9.plala.or.jp/majan/fst13.html)

1、一般形向聽數(shù)

向聽數(shù)=8-2×面子數(shù)-面子候補數(shù)

或:

向聽數(shù)=2×待做面子數(shù)-面子候補數(shù)

注意:

(1)面子候補數(shù)=搭子數(shù)+對子數(shù)。

(2)對面子、搭子和對子進行計數(shù)時,不能有重復(fù)使用的牌,即同一枚牌不能同時出現(xiàn)在不同的面子或面子候補中。

(3)面子數(shù)+面子候補數(shù)不超過4。如果面子+面子候補數(shù)>4,那么只需要取出其中的(4-面子數(shù))個面子候補,因此我們需要將上面式子中面子候補數(shù)的值修改為(4-面子數(shù))。(例如:1245m567p1235689s的向聽數(shù)為8-2×2-2=2)

(4)如果取出的面子及面子候補以外的牌中還存在可以作為雀頭的對子,那么還需要在上式計算結(jié)果的基礎(chǔ)上將向聽數(shù)減1。(例如:1245m567p1235688s的向聽數(shù)為1)

(5)如果取出面子候補時有可能在未使用的牌中保留可以作為雀頭的對子,那么就盡量那樣進行提取,因為這樣做的話可以使向聽數(shù)最小化。(例如:2356m34788p34s123z應(yīng)當取23m、56m、34p、34s為面子候補)

(6)有多個對子可以提取為雀頭的時候,盡量保證取出雀頭后面子候補數(shù)最多,更準確地說應(yīng)該是使取出雀頭后(2×面子數(shù)+面子候補數(shù))的值最大化,也就是說采用取出雀頭后向聽數(shù)最小化的取法。(例如:2356m3446p123445z應(yīng)當取44z為雀頭)

(7)將手牌拆解為面子和面子候補時,一般都是先盡量多取出面子,在剩下的部分盡量多取出面子候補,但是也有例外。這種情況下,應(yīng)該采用使得(2×面子數(shù)+面子候補數(shù))的值最大化,也就是使得向聽數(shù)最小化的取法。(例如:13334555712345z應(yīng)當取345m、13m、35m、57m為面子和面子候補,而非取333m、555m為面子)

(8)拆取面子和面子候補時的程序化步驟:

For 每個雀頭候補:

?????? 假設(shè)其為雀頭

? ? ? ?先取出雀頭

?????? 遞歸取出面子和面子候補,向聽數(shù)=8-2×面子數(shù)-面子候補數(shù)-1

?????? 找出最小的向聽數(shù)

End

假設(shè)沒有雀頭

遞歸取出面子和面子候補,向聽數(shù)=8-2×面子數(shù)-面子候補數(shù)

找出最小的向聽數(shù)

(9)仍然存在例外的情況。例如“東東東東南南南南西西西北北北”的向聽數(shù)計算為0,而實際上應(yīng)當為1,又如“東東東東南南南南西西西西北北”的向聽數(shù)計算為1,而實際上應(yīng)當為2。這種情況的出現(xiàn)是因為持有4枚相同的字牌。要解決這種情況,首先需要對孤立牌和是否持有4枚相同的字牌進行統(tǒng)計。如果孤立牌全為第4枚的字牌,那么就需要將向聽數(shù)增加1。

(10)上面的計算公式僅適用于1、4、7、10、13枚手牌的向聽數(shù)計算。2、5、8、11、14枚牌時的向聽數(shù),可以看作:切掉一枚牌做成的1、4、7、10、13枚手牌的最小向聽數(shù)。正常情況下,手牌的枚數(shù)不可能變成0、3、6、9、12枚,因此暫不考慮這些枚數(shù)的牌形的向聽數(shù)。

?

2、國士無雙向聽數(shù)

首先數(shù)一數(shù)幺九牌(一九字牌)的種類數(shù),從13中減去這個種類數(shù),如果存在幺九牌的對子,就再減1,最后得到的就是國士無雙的向聽數(shù)。

國士無雙向聽數(shù)=13-幺九牌種類數(shù)-(幺九對子數(shù)?1:0)

?

3、七對子向聽數(shù)

一般情況下:

七對子向聽數(shù)=6-對子數(shù)

但是手牌中有4枚相同的牌時,由于牌的種類數(shù)不足7,所以會導(dǎo)致向聽數(shù)增加。最終,七對子向聽數(shù)的計算公式為:

七對子向聽數(shù)=6-對子數(shù)+(牌的種類數(shù)<7?7-牌的種類數(shù):0)

注意:

(1)暗刻或未杠的暗杠算作也僅算作1個對子。

?

三、查表法求向聽數(shù)

(一)牌的編碼

如:“一一一二三五六④⑤⑧99東南”,牌要先排好序,可以按mpsz的順序,數(shù)牌數(shù)字從小到大,字牌按東→南→西→北→白→發(fā)→中的順序排序。

?

1、牌的數(shù)量的編碼(計數(shù))

結(jié)果如下:

{"一":3, "二":1, "三":1, "五":1, "六":1, "④":1, "⑤":1, "⑧":1, "9":2, "東":1, "南":1}

也就是:31111111211

?

2、牌的距離的編碼(間距編碼)

參考mjscore和了形判定的編碼方法:

間隔為1,即相差為2的兩枚同色數(shù)牌中間補1個0

間隔為2或以上,即相差為3或以上的兩枚同色數(shù)牌之間,不同種牌之間補2個0

向聽數(shù)計算與和了判定中不一樣的地方是,和了判定中數(shù)牌只有連續(xù)與否有意義,間隔為1或以上沒有區(qū)別,而在向聽數(shù)計算中,如35也是有效的聽牌形,所以間隔為1的兩枚同色數(shù)牌也有單獨區(qū)別的意義,而間隔為2或以上沒有區(qū)別。

如上,結(jié)果為:3110110011001002001001

以此編碼方式,最長的手牌及其編碼結(jié)果為:

“一四七②⑤⑧369東西南北中”:1001001001001001001001001001001001001001

共3×13+1=40位,每一位數(shù)值用3bit的話,需要3×40=120bit

?

3、編碼轉(zhuǎn)換(節(jié)省存儲空間)

利用0不會連續(xù)3個這一點,應(yīng)用下面的轉(zhuǎn)換規(guī)則:

我想到了兩種對應(yīng)方式,分別考慮兩種規(guī)則的效率。

規(guī)則①?????????? ?????? 規(guī)則②

1→10??????????? ?????? 1→0

2→110????????? ?????? 2→1110

3→1110??????? ?????? 3→1111110

4→11110???????????? 4→1111111110

10→100??????? ?????? 10→10

20→1100???????????? 20→11110

30→11100??? ?????? 30→11111110

40→111100? ?????? 40→11111111110

100→1000??? ?????? 100→110

200→11000? ?????? 200→111110

300→111000?????? 300→111111110

400→1111000???? 400→111111111110

也就是說,牌的數(shù)量按如下對應(yīng):

規(guī)則①?????????? 規(guī)則②

1→1????????????? 1→空

2→11??????????? 2→111

3→111????????? 3→111111

4→1111??????? 4→111111111

規(guī)則①補充:后面沒有0,補上0,后面有1個0,補上00,后面有2個0,補上000

規(guī)則②補充:后面沒有0,補上0,后面有1個0,補上10,后面有2個0,補上110

規(guī)則①的另一種對應(yīng)方式:

0→0

1→10

2→110

3→1110

4→11110

在兩種規(guī)則下,手牌對應(yīng)的編碼結(jié)果為:

規(guī)則①:

“一二三四五六①②③④⑤東東東”:1111110011111003

→101010101010001010101010001110

“一一一二三五六④⑤⑧99東南”:3110110011001002001001

→111010100101000101000100011000100010

“一四七②⑤⑧369東西南北中”:

1001001001001001001001001001001001001001

→100010001000100010001000100010001000100010001000100010,

共4×13+2=54位,需要54bit的存儲空間。

規(guī)則②:

“一二三四五六①②③④⑤東東東”:1111110011111003

→000001100000110111111

“一一一二三五六④⑤⑧99東南”:3110110011001002001001

→3,1,10,1,100,1,100,100,200,100,1

→1111110,0,10,0,110,0,110,110,111110,110,0

→1111110010011001101101111101100

“一四七②⑤⑧369東西南北中”:

1001001001001001001001001001001001001001

→1101101101101101101101101101101101101100,

共3×13+1=40位,需要40bit的存儲空間。

使用C++中的bitset數(shù)據(jù)結(jié)構(gòu),可以有效節(jié)省內(nèi)存空間。并且bitset支持二進制數(shù)的位操作,如按位與&、按位或|、按位異或^、按位取反~、左移<<、右移>>等位運算以及這些位運算的復(fù)合賦值操作。此外,還可以通過[]對bitset中的元素進行訪問和賦值(類似數(shù)組,最低位下標為0)。

(其它bitset數(shù)據(jù)結(jié)構(gòu)的函數(shù)方法可以參考如下網(wǎng)址:

http://www.cplusplus.com/reference/bitset/bitset/)

由此可見,規(guī)則②在對應(yīng)極端情況下的編碼所需的存儲空間更小。規(guī)則①實際上被編碼結(jié)果沒有連續(xù)4個0限制住了,雖然在一些特殊情況下需要的存儲空間相比規(guī)則②更少,但在極端情況下需要更多的存儲空間,而由于存儲一個牌形需要的存儲空間取決于極端情況,所以這導(dǎo)致了存儲空間的浪費。綜上,我們采用規(guī)則②的對應(yīng)方式。

?

4、調(diào)查所有的編碼序列(枚舉)

①對數(shù)量的枚舉:即對枚數(shù)N的加法分解問題,分解的結(jié)果類似步驟1的結(jié)果。

?

②對距離的枚舉:

限制條件:

Ⅰ)以步驟2的結(jié)果來枚舉,由00分割的各個子序列的距離<=8(1到9的距離),各個子序列的距離總和<=8×3=27。

Ⅱ)數(shù)牌的子序列之間的距離當成是3來計算,這時,數(shù)牌的子序列的距離之和與子序列之間的距離之和的總和<=27。

Ⅲ)00100這樣的子序列可以當成可以當成字牌的子序列或者數(shù)牌中孤張牌的子序列。一般先把其看成是字牌的子序列,除非當這樣的子序列個數(shù)超過7個時,超過7個的部分必須當成數(shù)牌中孤張牌的子序列。

?

③序列的排序和去重:

Ⅰ)以00分隔的各個子序列的選擇去重:

子序列自身進行反轉(zhuǎn)不會影響向聽數(shù),所以可以根據(jù)子序列和其逆序子序列的比較規(guī)則對他們進行選擇和去重。

如“一一一二三五六④⑤⑧99東南”:3110110011001002001001,

其中的311011子序列,和其反序列110113序列是重復(fù)的,可以根據(jù)子序列的比較規(guī)則對他們進行選擇去重。

比較規(guī)則可以直接根據(jù)字符串或數(shù)值的大小進行比較。

?

Ⅱ)以00分隔的各個子序列之間的排序:

由于各個子序列的交換順序不影響向聽數(shù),所以可以根據(jù)各個子序列之間的比較規(guī)則對他們進行選擇和去重。

如“一一一二三五六④⑤⑧99東南”:3110110011001002001001,

這個序列和3110110010010010020011序列的向聽數(shù)是相同的,可以對他們進行選擇去重。

可以根據(jù)各個子序列的比較關(guān)系進行排序,這樣就可以達到選擇去重的效果。

?

5、對序列求向聽數(shù)

可以對手牌進行拆解,使用回溯法、深度優(yōu)先搜索(DFS)等方法對牌面的拆解進行遞歸遍歷,從而判斷手牌的向聽數(shù)。詳情可以參考天鳳牌理的計算向聽數(shù)的代碼<syanten1007.js>。

?

6、編碼存儲到文件

將序列轉(zhuǎn)換成編碼后,將序列的編碼及其向聽數(shù)保存到序列中,可以按如下結(jié)構(gòu)進行存儲。

syanten = [{}, {}, {}, ...]

該列表的索引i即為向聽數(shù)-1(-1向聽為和了形,0向聽為聽牌形),這樣就不用再額外保存序列的向聽數(shù)了,不過這樣就需要對所有序列按向聽數(shù)先進行分類。

syanten[i]為向聽數(shù)為i-1的所有序列,可以將序列的編碼作為字典的key值,這樣可以為每個序列額外保存一些信息。如果不需要保存額外信息的話,可以將syanten[i]定義為set等其他哈希結(jié)構(gòu),方便進行查詢。

?

7、編碼的壓縮

可以采用差分編碼對編碼進行壓縮,進一步在不降低查詢效率的情況下節(jié)省存儲空間。

編碼方式可以采用霍夫曼編碼(Huffman Coding)。

?

日麻向聽數(shù)計算的評論 (共 條)

分享到微博請遵守國家法律
达孜县| 和林格尔县| 虹口区| 洛隆县| 宁陕县| 沾益县| 安宁市| 灵台县| 石渠县| 德化县| 普定县| 乳山市| 库车县| 崇阳县| 宜丰县| 扎鲁特旗| 永丰县| 汉川市| 额尔古纳市| 无为县| 绵阳市| 莲花县| 遵化市| 交城县| 黄冈市| 大安市| 衡东县| 扎赉特旗| 阿瓦提县| 曲麻莱县| 普宁市| 公主岭市| 黄龙县| 新宁县| 汽车| 鹤壁市| 安达市| 大英县| 长治县| 长乐市| 宜宾县|