wm #8532(2009/02/18 13:10 GMT) [ Other ] Rating-5/9=-0.56
1 2 3 4 5 6 7 8
for 考えられる対子: 対子を手牌から抜く for 考えられる刻子のパターン: 刻子を手牌から抜く 手牌が順子の和となっていれば、和了形として抜ける 刻子を手牌へ戻す 対子を手牌へ戻す ここに到達していれば、和了形ではない
Rating-5/9=-0.56-0+
[ reply ]
wm #8532() [ Other ] Rating-5/9=-0.56
手牌を表すのは、mn+h 枚を表す配列です。フォーマットは A, B の2つから任意に選んだものを受け取ってください。以下の2つは同じものです:
handA = [2,1,1,1,1,2,2,1,3] # 牌1が2個、牌2が1個、牌3が1個、牌4が1個、牌5が1個、牌6が2個、牌7が2個、牌8が1個、牌9が3個
handB = [1,1,2,3,4,5,6,6,7,7,8,9,9,9] # 牌1、牌1、牌2、牌3、牌4、牌5、牌6、牌7、牌7、牌8、牌9、牌9、牌9
ある配列が和了形であるとは、手牌が「刻子」「順子」を合計 n 個と「対子」1 個との和であることをいうものとします。
「刻子」とは1種の牌が m 個あることをいいます。
「順子」とは連続したインデクスを持つ牌が m 種各1個あることをいいます。
「対子」とは1種の牌が h 個あることをいいます。
上の例は、和了形です。なぜなら、当該配列が
Bタイプで表記すると、刻子 [9,9,9], 順子 [2,3,4], [5,6,7], [6,7,8], 対子 [1,1] の、
Aタイプで表記すると、刻子 [0,0,0,0,0,0,0,0,3], 順子 [0,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,0,0], [0,0,0,0,0,1,1,1,0], 対子 [2,0,0,0,0,0,0,0,0] の、
和だからです。
・ n は任意のものを受け取れるようにしてください。
・ 牌のインデクスの数 (Aタイプの長さ、Bタイプの要素の最大値) M も任意としてください。
・ 1種の牌の最大個数 (Aタイプの要素の最大値、Bタイプの1種の要素の最大重複度) L も任意としてください。
・ 一般の麻雀の場合は、m=3, n=4, h=2, M=9, L=4 です。この条件に特化した高速化が可能なら行ってもかまいません。
擬似コードで、ごく短い例を示します。
for 考えられる対子: 対子を手牌から抜く for 考えられる刻子のパターン: 刻子を手牌から抜く 手牌が順子の和となっていれば、和了形として抜ける 刻子を手牌へ戻す 対子を手牌へ戻す ここに到達していれば、和了形ではないRating-5/9=-0.56-0+
[ reply ]